Pertanyaan Hanya komit bagian dari file di Git


Saat saya membuat perubahan pada file di Git, bagaimana saya hanya dapat melakukan beberapa perubahan?

Sebagai contoh, bagaimana saya bisa melakukan hanya 15 baris dari 30 baris yang telah diubah dalam file?


2237
2017-07-06 02:25


asal


Jawaban:


Kamu dapat memakai git add --patch <filename> (atau -p untuk pendek), dan git akan mulai memecah file Anda menjadi apa yang dianggapnya sebagai "hunks" (bagian dari file) yang masuk akal. Ini kemudian akan mendorong Anda dengan pertanyaan ini:

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

Berikut ini uraian setiap opsi:

  • y panggung bingkah ini untuk komit berikutnya
  • n jangan lakukan stage ini untuk commit berikutnya
  • q berhenti; jangan mementaskan bingkisan ini atau bongkahan yang tersisa
  • Sebuah panggung bongkahan ini dan semua bakhil kemudian dalam file
  • d jangan mementaskan bingkisan ini atau bonggol berikutnya di dalam file
  • g pilih sebongkah untuk pergi
  • / mencari bingkah yang cocok dengan regex yang diberikan
  • j biarkan bidak ini ragu-ragu, lihat bongkahan yang belum diputuskan berikutnya
  • J tinggalkan bingkisan ini tanpa memutuskan, lihat bongkahan berikutnya
  • k tinggalkan bingkah ini tanpa memutuskan, lihat bongkahan yang belum diputuskan sebelumnya
  • K tinggalkan bingkisan ini tanpa memutuskan, lihat bongkahan sebelumnya
  • s membagi bingkahan saat ini menjadi bongkahan yang lebih kecil
  • e edit secara manual bingkahan saat ini
  • ? cetak bantuan cowok

Jika file tersebut belum dalam repositori, Anda dapat terlebih dahulu melakukannya git add -N <filename>. Setelah itu Anda bisa melanjutkan git add -p <filename>.

Setelah itu, Anda dapat menggunakan:
git diff --staged untuk memeriksa apakah Anda melakukan perubahan yang benar
git reset -p unstage keliru menambahkan hunks
git commit -v untuk melihat komit Anda saat Anda mengedit pesan commit.

Catatan ini jauh berbeda dari git format-patch perintah, yang tujuannya adalah untuk mem-parsing data commit menjadi a .patch file.

Referensi untuk masa depan: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


2931
2017-07-06 11:49



Kamu dapat memakai git add --interactive atau git add -p <mengajukan>, lalu git commit (tidak  git commit -a); Lihat Mode interaktif di git-add manpage, atau cukup ikuti instruksi.

Git modern juga git commit --interactive (dan git commit --patch, yang merupakan opsi shortcut to patch dalam komit interaktif).

Jika Anda lebih suka melakukannya dari GUI, Anda dapat menggunakan git-gui. Anda cukup menandai potongan yang ingin Anda masukkan dalam komit. Saya pribadi merasa lebih mudah daripada menggunakan git add -i. Git GUI lainnya, seperti QGit atau GitX, mungkin juga memiliki fungsi ini.


215
2017-07-06 02:41



git gui menyediakan fungsi ini di bawah tampilan diff. Cukup klik kanan baris (s) Anda tertarik dan Anda harus melihat "tahap baris ini untuk melakukan" item menu.


115
2017-09-25 20:45



aku percaya itu git add -e myfile adalah cara termudah (preferensi saya setidaknya) karena ini hanya membuka editor teks dan memungkinkan Anda memilih baris yang ingin Anda pamerkan dan garis mana yang tidak Anda lakukan. Mengenai perintah pengeditan:

menambahkan konten:

Konten yang ditambahkan diwakili oleh garis yang dimulai dengan "+". Anda dapat mencegah pementasan setiap baris tambahan dengan menghapusnya.

konten yang dihapus:

Konten yang dihapus diwakili oleh garis yang dimulai dengan "-". Anda dapat mencegah pementasan mereka dengan mengubah "-" menjadi "" (spasi).

konten yang dimodifikasi:

Konten yang dimodifikasi diwakili oleh "-" garis (menghapus konten lama) diikuti dengan "+" garis (menambahkan konten pengganti). Anda dapat mencegah pementasan modifikasi dengan mengubah "-" garis menjadi "", dan menghapus "+"              garis. Waspadai bahwa hanya memodifikasi setengah dari pasangan kemungkinan akan memperkenalkan perubahan yang membingungkan pada indeks.

Setiap detail tentang git add tersedia di git --help add 


55
2018-02-23 10:37



Jika Anda menggunakan vim, Anda mungkin ingin mencoba plugin hebat yang disebut buronan.

Anda dapat melihat diff file antara copy pekerjaan dan index dengan :Gdiff, dan kemudian menambahkan garis atau hunks ke indeks menggunakan perintah diff vim klasik seperti dp. Simpan modifikasi dalam indeks dan komit dengan :Gcommit, dan selesai.

Pendahuluan pendahuluan yang sangat bagus sini (lihat khususnya bagian 2).


41
2017-08-12 13:32



Saya sangat menyarankan menggunakan SumberTree dari Atlassian. (Gratis.) Itu membuat ini sepele. Anda dapat mementaskan setiap individu kode atau baris kode individu dengan cepat dan mudah.

enter image description here


26
2017-12-05 17:29



Perlu dicatat bahwa untuk digunakan git add --patch untuk sebuah file baru Anda harus terlebih dahulu menambahkan file untuk diindeks git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14



Ketika saya memiliki banyak perubahan, dan akhirnya akan membuat beberapa commit dari perubahan, maka saya ingin menyimpan titik awal saya untuk sementara sebelum melakukan pementasan.

Seperti ini:

$ 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 Whymarrh adalah apa yang biasanya saya lakukan, kecuali kadang-kadang ada banyak perubahan dan saya dapat mengatakan bahwa saya mungkin membuat kesalahan saat melakukan pementasan, dan saya ingin negara yang berkomitmen saya dapat kembali lagi untuk lulus kedua.


17
2017-07-08 07:00



Jika Anda menggunakan emacs, lihatlah Magit, yang menyediakan antarmuka git untuk emacs. Mendukung pementasan orang bakhil (bagian dari file) cukup baik.


12
2017-08-07 13:25



Sama seperti jawaban jdsumsion Anda juga dapat menyimpan pekerjaan Anda saat ini tetapi kemudian menggunakan difftool seperti meld untuk menarik perubahan yang dipilih dari simpanan. Dengan cara itu Anda bahkan dapat mengedit hunks secara manual dengan sangat mudah, yang merupakan sedikit rasa sakit saat masuk 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, jika kode Anda masih berfungsi, sebelum Anda melakukannya.


7
2017-07-27 09:52