Saat menerapkan tambalan, adakah cara untuk menyelesaikan konflik?

124

Saya di jendela.

Untuk berbagai alasan kami memiliki beberapa contoh git dari cabang svn yang berbeda.

Sering kali saya ingin memperbaiki masalah di repositori A, membuat tambalan, dan menerapkannya ke repositori B. Ini berfungsi dengan baik kecuali jika ada konflik.

Saat melakukan rebasing, saya cukup mengklik kanan folder dan menggunakan tortioseGit dan memilih opsi penyelesaian. Ini menunjukkan cara yang bagus untuk membiarkan saya mengatasi konflik saya.

Apakah ada cara untuk melakukannya dengan potongan tambalan yang ditolak?

Berikut adalah pendekatan saya saat ini untuk membuat / menerapkan tambalan

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
sumber
3
Saya biasanya melakukannya dengan tangan ketika semua opsi tambalan gagal ...
stdcall
Jika penggabungan gagal, itu karena program tidak dapat mengetahui cara melakukan penggabungan secara ambigu. Anda harus mendapatkan file dengan <<<<, ===, >>>> set dan Anda harus masuk dan menyelesaikannya dengan tangan.
tacaswell
Ya melakukannya dengan tangan adalah pita nyata ketika Anda berbicara beberapa 100 rej hunks.
Kenoyer130
Saat itulah Anda ingin menggunakan git mergetooldan melakukan penggabungan 3 arah dengan gui pilihan Anda (saya lebih memilih kdiff di windows) ...
g19fanatic

Jawaban:

254

Untuk membuat tambalan Anda, lakukan hal berikut:

git format-patch --stdout first_commit^..last_commit > changes.patch

Sekarang ketika Anda siap untuk menerapkan tambalan:

git am -3 < changes.patch

yang -3akan melakukan penggabungan tiga arah jika ada konflik. Pada titik ini Anda dapat melakukan git mergetooljika Anda ingin pergi ke gui atau hanya secara manual menggabungkan file menggunakan vim (standar <<<<<<, ||||||,>>>>>> resolusi konflik).

g19fanatic
sumber
3
Ini mungkin berguna untuk menambah --ignore-whitespace --ignore-space-changeke git amjuga. Saya memiliki penggabungan sepele yang tidak akan terjadi tanpanya.
angularsen
12
git apply -3 changes.patchtampaknya bekerja untuk saya juga
peterflynn
1
Meskipun tambalan tidak berlaku dengan bersih, saya masih mendapatkan "Tidak ada file yang perlu digabungkan" dari git mergetool. Sebaliknya saya harus menemukan basis komit patch asli yang digunakan, terapkan di atas itu (untungnya repo saya memiliki ini) dan kemudian rebase.
jozxyqk
4
Saya mengalami masalah yang sama dengan @jozxyqk. Baik git am -3dan tidak git apply -3akan benar-benar menjatuhkan penanda konflik ke file saya, meskipun saya mendapatkan pesan seperti Applied patch to 'configure.ac' with conflicts.dan error: patch failed: .... Ini aktif git 2.17.1. Mungkin ketika beberapa file tidak dapat ditambal sama sekali, git berputar kembali?
nh2
1
Saya mendapat masalah yang sama dengan @ nh2, apakah Anda pernah menemukan masalahnya?
Eridanis
12

Jika Anda sering mengalami konflik yang sama saat menerapkan patch, rebasing, atau merging, Anda dapat menggunakan fungsi git rerere (menggunakan kembali resolusi yang direkam). Ini memungkinkan Anda untuk menentukan sebelumnya bagaimana konflik harus diselesaikan berdasarkan bagaimana Anda menyelesaikannya di masa lalu. Lihat http://git-scm.com/blog/2010/03/08/rerere.html untuk detail tentang cara kerjanya.

mplf
sumber
5

TortoiseGit memiliki fitur penggabungan yang bisa membuka file patch.

Ada fotonya di sini .

ams
sumber
Sebenarnya opsi penggabungan mungkin yang saya cari.
Kenoyer130
Betulkah? Saya sudah lama tidak menggunakan tortoise, tetapi halaman yang ditautkan memiliki teks "TortoiseMerge dapat membuka file patch Git secara langsung, Anda memeriksanya dan menambal ke copy pekerjaan.", Jadi sepertinya harus!
pagi
itu tidak membuka file patch ... namun, terkadang format file patch rusak tortoisegitmerge. Saya tidak pernah sukses dengan diff -u, melainkan diff -c output.
thistleknot
Anda juga dapat menyeret patch ke kanan pada folder pohon kerja dan memilih "Terapkan serial patch" (untuk patch seperti 0001-xxx.patch, ... 0002-xxy.patch) atau "Terapkan file patch tunggal".
MrTux
2

Pendekatan saya adalah:

  • Buat "Integrasi" -Cabang di mana file identik
  • Terapkan patch ke Integration-Branch ini
  • Gabungkan atau rebase menjadi master (tidak tahu apakah rebase berguna di sini, karena saya tidak tahu apa yang akan terjadi saat menerapkan tambalan lebih lanjut)
MichiBack
sumber