Perbaiki hanya sebagian file di Git

Ketika saya membuat perubahan pada file di Git, bagaimana saya bisa membuat hanya beberapa perubahan?

Misalnya, bagaimana saya bisa menjalankan hanya 15 baris dari 30 baris yang telah diubah dalam file?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara diatur pada 06 Juli 2009 pada 05:25 2009-07-06 05:25
@ 22 jawaban

Anda dapat menggunakan git add --patch <filename> (atau -p singkatnya), dan git akan mulai memecah file Anda menjadi apa yang dianggap wajar sebagai "potongan" (bagian dari file). Kemudian dia akan memberi tahu Anda pertanyaan ini:

 Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? 

Berikut ini adalah deskripsi dari setiap opsi:

  • y persiapkan bagian ini untuk komitmen selanjutnya
  • dan jangan menaruh karya ini untuk komitmen selanjutnya
  • q output; jangan letakkan bagian ini atau bagian yang tersisa
  • a menempatkan bagian ini dan semua fragmen berikutnya dalam file
  • d jangan meletakkan blok ini atau fragmen yang lebih baru dalam file
  • g pilih bagian yang akan dituju
  • / cari blok yang cocok dengan ekspresi reguler yang ditentukan
  • j biarkan bagian ini tidak terselesaikan, lihat bagian yang belum terselesaikan berikutnya
  • J meninggalkan bagian ini tidak terselesaikan, lihat bagian selanjutnya
  • k tinggalkan bagian ini tidak terpecahkan, lihat bagian sebelumnya tidak terpecahkan
  • K biarkan bagian ini tidak terselesaikan, lihat bagian sebelumnya
  • s bagilah bagian yang sekarang menjadi potongan-potongan kecil
  • e secara manual mengedit blok saat ini
  • ? bantuan cetak

Jika file tersebut belum ada di repositori, Anda dapat melakukan git add -N <filename> . Setelah itu Anda dapat melanjutkan dengan git add -p <filename> .

Setelah itu Anda bisa menggunakan:

  • git diff --staged untuk memastikan Anda memasukkan perubahan yang benar
  • git reset -p untuk membatalkan kesalahan menambahkan fragmen
  • git commit -v untuk melihat komit Anda saat mengedit pesan komit.

Harap dicatat bahwa ini sangat berbeda dari perintah git format-patch , yang bertujuan untuk menganalisis data .patch dari file .patch .

Tautan ke masa depan: Git Tools - Produksi interaktif

3149
06 июля '09 в 5:36 2009-07-06 05:36 jawabannya diberikan oleh cloudhead 06 Juli 2009 di 5:36 2009-07-06 05:36

Anda dapat menggunakan git add --interactive atau git add -p <file> , dan kemudian git commit ( bukan git commit -a ); lihat mode interaktif di manual git-add atau cukup ikuti instruksi.

Modern Git juga memiliki git commit --interactive (dan git commit --patch , yang merupakan pintasan ke parameter patch dalam komit interaktif).

border=0

Jika Anda lebih suka melakukan ini dari GUI, Anda bisa menggunakan git-gui . Anda cukup menandai bagian yang ingin Anda sertakan dalam komit. Saya pribadi merasa lebih mudah daripada menggunakan git add -i . GUI Git lain, seperti QGit atau GitX, mungkin juga memiliki fungsi ini.

223
06 июля '09 в 14:49 2009-07-06 14:49 jawabannya diberikan oleh Jakub Narębski 06 Juli 2009 di 14:49 2009-07-06 14:49

git gui menyediakan fungsi ini sebagai diff. Cukup klik kanan pada baris yang menarik bagi Anda, dan Anda akan melihat item menu "Baris ini untuk memperbaiki".

118
06 июля '09 в 5:41 2009-07-06 05:41 Jawaban diberikan oleh Ionuț G. Stan 06 Juli 2009 di 5:41 2009-07-06 05:41

Saya percaya bahwa git add -e myfile adalah cara termudah (setidaknya preferensi saya), karena cukup membuka editor teks dan memungkinkan Anda untuk memilih baris mana yang ingin Anda jalankan dan baris mana yang tidak Anda inginkan. Mengenai perintah pengeditan:

Konten yang ditambahkan:

Konten yang ditambahkan diwakili oleh baris yang dimulai dengan "+". Anda dapat mencegah pembuatan garis tambahan apa pun dengan menghapusnya.

konten jarak jauh:

Konten yang dihapus diwakili oleh string yang dimulai dengan "-". Anda dapat mencegah penghapusan mereka dengan mengonversi "-" ke "" (spasi).

konten yang dimodifikasi:

Konten yang dimodifikasi diwakili oleh baris "-" (penghapusan konten lama), diikuti oleh baris "+" (menambahkan konten pengganti). Anda dapat mencegah instalasi modifikasi dengan mengubah string "-" menjadi "" dan menghapus garis "+". Ingat bahwa mengubah hanya setengah dari pasangan cenderung menyebabkan perubahan indeks yang membingungkan.

Setiap git add tersedia di git --help add

64
25 сент. jawabannya diberikan oleh theFreedomBanana 25 Sep 2015-09-25 23:45 '15 jam 11:45 malam 2015-09-25 23:45

Jika Anda menggunakan vim, Anda dapat mencoba sebuah plugin hebat yang disebut buron .

Anda dapat melihat file diff antara copy yang berfungsi dan indeks dengan :Gdiff , dan kemudian menambahkan baris atau kolom ke indeks menggunakan perintah-perintah vim klasik, seperti dp . Simpan perubahan ke indeks dan salin dengan :Gcommit , dan Anda selesai.

Video intro yang sangat bagus di sini (lihat bagian 2 ).

42
23 февр. Jawabannya diberikan oleh François pada 23 Feb. 2012-02-23 13:37 '12 pada pukul 1:37 siang waktu 2012-02-23 13:37

Saya sangat merekomendasikan menggunakan SourceTree dari Atlassian. (Ini gratis.) Itu membuatnya sepele. Anda dapat dengan cepat dan mudah membuat setiap potongan kode atau setiap baris kode.

2019

29
12 авг. jawabannya diberikan oleh user486646 12 Agustus. 2014-08-12 16:32 '14 pada 16:32 2014-08-12 16:32

Perlu dicatat bahwa untuk menggunakan git add --patch untuk file baru, Anda harus terlebih dahulu menambahkan file ke indeks menggunakan git add --intent-to-add :

 git add -N file git add -p file 
22
05 дек. Jawabannya diberikan oleh user1338062 05 Desember. 2014-12-05 20:29 '14 pada 20:29 2014-12-05 20:29

Ketika saya memiliki banyak perubahan dan akhirnya membuat beberapa komitmen dari perubahan, saya ingin menyimpan sementara titik awal saya sebelum membuat sesuatu.

Ini dia:

 $ git stash -u Saved working directory and index state WIP on master: 47a1413 ... $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 1st commit" $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 2nd commit" $ git stash pop 

Jawaban Whymarh adalah apa yang biasanya saya lakukan, kecuali kenyataan bahwa kadang-kadang banyak perubahan terjadi, dan saya dapat mengatakan bahwa saya dapat membuat kesalahan saat mengatur sesuatu, dan saya ingin beberapa negara untuk mundur ke pass kedua .

19
07 июня '13 в 1:14 2013-06-07 01:14 jawabannya diberikan jdsumsion 07 Juni '13 pada 1:14 2013-06-07 01:14

Jika Anda menggunakan emacs, periksa Magit , yang menyediakan antarmuka git untuk emacs. Itu juga mendukung fragmen menengah (bagian dari file).

12
08 июля '09 в 10:00 2009-07-08 10:00 Balas diberikan oleh Mark van Lent 08 Juli 2009 di 10:00 2009-07-08 10:00

Seperti dengan jdsumsion, Anda juga dapat menyembunyikan pekerjaan Anda saat ini, tetapi kemudian menggunakan difffool, seperti berbaur, untuk menarik perubahan yang dipilih dari cache. Jadi Anda bahkan dapat mengedit potongan secara manual, yang agak menyakitkan ketika di git add -p :

 $ git stash -u $ git difftool -d -t meld stash $ git commit -a -m "some message" $ git stash pop 

Menggunakan metode simpanan memberi Anda kesempatan untuk menguji apakah kode Anda masih berjalan sebelum menjalankannya.

8
07 авг. jawaban yang diberikan derhoch 07 Agustus. 2013-08-07 16:25 '13 pada 16:25 2013-08-07 16:25

Intellij IDEA (dan saya percaya bahwa semua produk lain dalam seri) membangun dukungan untuk sebagian komitmen, sejak v2018.1

2019

Bagi mereka yang menggunakan Git Extensions :

Di jendela "Salin", pilih file yang ingin Anda komit sebagian, lalu pilih teks yang ingin Anda perbaiki di panel kanan, lalu klik kanan pada pilihan dan pilih "Hasilkan garis yang dipilih" di menu konteks.

7
27 июля '15 в 12:52 2015-07-27 12:52 jawabannya diberikan srgstm 27 Juli '15 di 12:52 2015-07-27 12:52

Plugin vim-gitgutter dapat membuat bakhun tanpa meninggalkan editor vim, menggunakan

 :GitGutterStageHunk 

Selain itu, ia menyediakan fitur menarik lainnya, seperti kolom dengan tanda yang berbeda, seperti pada beberapa IDE modern.

Jika hanya sebagian dari bongkahan yang disediakan vim -fugitive

 :Gdiff 

memungkinkan Anda untuk memilih rentang rentang yang terlihat, kemudian :'<,'>diffput atau :'<,'>diffget untuk mengubah / mengubah setiap baris.

6
09 янв. jawabannya diberikan c0ffeeartc 09 januari . 2015-01-09 20:11 '15 pada 20:11 2015-01-09 20:11

Saya mencoba git add -p filename.x , tetapi pada Mac saya menemukan bahwa gitx ( http://gitx.frim.nl/ atau https://github.com/pieter/gitx ) jauh lebih mudah untuk membuat persis garis yang saya inginkan .

5
16 авг. balasan diberikan jasongregori 16 Agu. 2011-08-16 02:43 '11 pada 2:43 2011-08-16 02:43

Dengan TortoiseGit:

Klik kanan file tersebut dan gunakan Context Menu → Restore after commit . Ini akan membuat salinan file apa adanya. Maka Anda dapat mengedit file, misalnya. TortoiseGitMerge dan buang semua perubahan yang tidak ingin Anda lakukan. Setelah menyimpan perubahan ini, Anda dapat mengkomit file.

4
06 апр. jawabannya diberikan oleh Fr0sT 06 Apr. 2015-04-06 19:16 '15 pada 19:16 2015-04-06 19:16

git-meld-index - mengutip dari situs web:

git -meld-index menjalankan berbaur - atau git diffftool lainnya (kdiff3, difuse, dll.) - sehingga Anda dapat secara interaktif mengubah perubahan pada indeks git (juga dikenal sebagai git).

Ini mirip dengan fungsi git add -p dan git add --interactive. Dalam beberapa kasus, berbaur lebih mudah / lebih cepat digunakan daripada git add -p. Ini karena berbaur memungkinkan Anda, misalnya:

  • lihat lebih banyak konteks
  • lihat perbedaan intraline
  • edit secara manual dan lihat pembaruan diff 'live' (diperbarui setelah setiap tombol ditekan)
  • buka perubahan, tanpa n untuk setiap perubahan yang ingin Anda lewati.

Penggunaan

Di repositori git, jalankan:

 git meld-index 

Anda akan melihat bahwa berbaur (atau gft diffftool dikonfigurasi) muncul oleh

KIRI : file direktori sementara disalin dari pohon kerja

KANAN : direktori sementara dengan isi indeks. Ini juga termasuk file yang belum ada dalam indeks, tetapi diubah atau tidak diperiksa dalam copy pekerjaan - dalam hal ini Anda akan melihat isi file dari HEAD.

Edit indeks (kanan) hingga bahagia. Jangan lupa menabung jika perlu.

Setelah selesai, tutup bld dan git-bld-index akan memperbarui indeks agar sesuai dengan isi direktori sementara di sebelah kanan perintah bld yang baru saja Anda edit.

2
04 июля '15 в 23:26 2015-07-04 23:26 jawabannya diberikan oleh Croad > 04 Juli '15 di 23:26 2015-07-04 23:26

Emacs juga memiliki gitsum

2
13 июля '09 в 0:52 2009-07-13 00:52 jawabannya diberikan zut 13 Juli 2009 di 0:52 2009-07-13 00:52

Menambahkan jawaban sebelumnya, jika Anda lebih suka menggunakan baris perintah, ketik git add -e myfile memberi Anda pilihan untuk memilih baris demi baris yang ingin Anda komit, karena perintah ini akan membuka editor dengan perbedaan, misalnya:

2019

24 авг. Jawabannya diberikan Beto Aveiga 24 Agustus. 2018-08-24 18:24 '18 pukul 18:24 2018-08-24 18:24

Untuk pengguna Atom , paket github menyertakan pengaturan gaya git gui interaktif. Untuk label, lihat dokumentasi kemasan.

Menggunakan Atom memungkinkan Anda untuk bekerja dengan tema dengan latar belakang gelap (secara default, git gui memiliki latar belakang putih).

1
10 апр. Jawaban yang diberikan oleh Ioannis Filippidis 10 Apr 2018-04-10 05:31 '18 pukul 17:31 2018-04-10 05:31

Seperti yang ditunjukkan oleh satu jawaban di atas, Anda dapat menggunakan git add --patch filename.txt

atau form pendek git add -p filename.txt

... tetapi untuk file yang sudah ada di repositori Anda, ada jauh lebih baik untuk menggunakan flag -patch untuk perintah commit (jika Anda menggunakan versi git yang cukup baru): git commit --patch filename.txt

... atau, sekali lagi, formulir pendek git commit -p filename.txt

... dan kemudian menggunakan kunci yang ditentukan (y / n, dll.), untuk memilih garis yang akan dimasukkan dalam komit.

1
30 июня '14 в 11:34 2014-06-30 11:34 jawabannya diberikan oleh Samuel Lampa pada 30 Juni '14 pukul 11:34 2014-06-30 11:34

git-cola adalah antarmuka grafis yang sangat baik, serta fungsi bawaan. Cukup pilih garis untuk adegan itu dan tekan S. Jika tidak ada pilihan yang dibuat, sepotong penuh dijalankan.

0
27 авг. jawabannya diberikan AndiDog 27 Agustus. 2015-08-27 14:28 '15 pada 14:28 2015-08-27 14:28

Jika pada platform Windows , menurut saya, git gui adalah alat terbaik untuk stage / commit banyak baris dari file yang unstaged .

1. Terima kasih:

  • Pilih file dari bagian unstagged Changes
  • Klik kanan kode yang ingin Anda jalankan.
  • Pilih Stage Hunk for commit

2. Baris:

  • Pilih file dari bagian unstagged Changes
  • Pilih baris / garis yang akan diatur.
  • Pilih Stage Lines for commit

3. Jika Anda ingin membuat file lengkap, kecuali untuk beberapa baris:

  • Pilih file dari bagian unstagged Changes
  • Tekan Ctrl+T (Stage file to commit)
  • File yang dipilih sekarang dipindahkan ke Bagian Staged Changes .
  • Pilih baris / garis yang akan diatur.
  • Pilih UnStage Lines for commit
0
28 мая '15 в 15:52 2015-05-28 15:52 Jawaban diberikan oleh Anvesh Yalamarthy pada 28 Mei '15 pukul 15:52 2015-05-28 15:52

Pertanyaan lain tentang tag atau Ajukan Pertanyaan