Cara mengatasi penggabungan konflik di git

Apakah ada cara yang baik untuk menjelaskan cara menyelesaikan konflik git di git?

4274
02 окт. Spoike mengatur 02 Oktober. 2008-10-02 14:31 '08 pukul 14:31 2008-10-02 14:31
@ 37 jawaban
  • 1
  • 2

Coba: git mergetool

Ini membuka antarmuka grafis yang berjalan melalui setiap konflik, dan Anda dapat memilih cara menggabungkan. Terkadang ini membutuhkan sedikit pengeditan manual setelahnya, tetapi biasanya cukup dengan sendirinya. Ini jauh lebih baik daripada melakukan semuanya secara manual.

Menurut komentar @JoshGlover:

Perintah tidak harus membuka GUI jika Anda tidak menginstalnya. Menjalankan git mergetool bagi saya menyebabkan penggunaan vimdiff . Anda dapat menginstal salah satu alat berikut untuk menggunakannya sebagai gantinya: meld , opendiff , kdiff3 , tkdiff , xxdiff , tortoisemerge , gvimdiff , diffuse , ecmerge , p4merge , araxis , vimdiff , emerge .

Di bawah ini adalah contoh prosedur untuk menggunakan vimdiff untuk menyelesaikan konflik penggabungan. Dengan tautan ini

> : Jalankan perintah berikut di terminal Anda

 git config merge.tool vimdiff git config merge.conflictstyle diff3 git config mergetool.prompt false 

Ini akan menetapkan vimdiff sebagai alat penggabungan default.

> : Jalankan perintah berikut di terminal

 git mergetool 

> : Anda akan melihat tampilan vimdiff dalam format berikut.

  +----------------------+ | | | | |LOCAL |BASE |REMOTE | | | | | +----------------------+ | MERGED | | | +----------------------+ 

4 tipe ini

LOCAL adalah file dari cabang saat ini.

DASAR - nenek moyang yang sama, bagaimana file terlihat sebelum keduanya berubah

REMOTE - file yang Anda gabungkan ke cabang Anda

MERGED - hasil merger, inilah yang disimpan dalam repo

Anda dapat menavigasi antara tampilan ini menggunakan ctrl+w Anda dapat >ctrl+w dan j .

Informasi lebih lanjut tentang navigasi vimdiff di sini dan di sini.

> Anda dapat mengedit MERGED sebagai berikut.

Jika Anda ingin menerima perubahan dari REMOTE

 :diffg RE 

Jika Anda ingin menerima perubahan dari BASE

 :diffg BA 

Jika Anda ingin menerima perubahan dari LOCAL

 :diffg LO 

> Simpan, keluar, kunci dan hapus

:wqa simpan dan keluar vi

git commit -m "message"

git clean Hapus file yang tidak perlu (misalnya, * .orig) yang dibuat oleh alat diff.

2535
02 окт. Balasan diberikan oleh Peter Burns 02 Oktober. 2008-10-02 20:50 '08 pada jam 8:50 malam 2008-10-02 20:50

Berikut ini adalah preseden yang memungkinkan, dari atas:

Anda akan melakukan beberapa perubahan, tetapi sayangnya, Anda tidak tahu:

 git fetch origin git pull origin master From ssh://gitosis@example.com:22/projectname * branch master -> FETCH_HEAD Updating a030c3a..ee25213 error: Entry 'filename.c' not uptodate. Cannot merge. 

Jadi, Anda memperbarui dan mencoba lagi, tetapi Anda memiliki konflik:

 git add filename.c git commit -m "made some wild and crazy changes" git pull origin master From ssh://gitosis@example.com:22/projectname * branch master -> FETCH_HEAD Auto-merging filename.c CONFLICT (content): Merge conflict in filename.c Automatic merge failed; fix conflicts and then commit the result. 

Jadi Anda memutuskan untuk melihat perubahannya:

border=0
 git mergetool 

Oh, saya, oh, hulu, saya telah mengubah beberapa hal, tetapi hanya menggunakan perubahan saya ... tidak ... perubahan mereka ...

 git checkout --ours filename.c git checkout --theirs filename.c git add filename.c git commit -m "using theirs" 

Dan kemudian kita coba yang terakhir kali.

 git pull origin master From ssh://gitosis@example.com:22/projectname * branch master -> FETCH_HEAD Already up-to-date. 

Ta-da!

1625
04 авг. jawabannya diberikan oleh CoolAJ86 04 Agustus. 2010-08-04 20:04 '10 pada 8:04 PM 2010-08-04 20:04

Saya menemukan bahwa alat penggabungan jarang membantu saya memahami konflik atau resolusi. Saya biasanya lebih berhasil melihat penanda konflik dalam editor teks dan menggunakan git log sebagai pelengkap.

Berikut beberapa tips:

Dewan satu

Yang terbaik yang saya temukan adalah menggunakan gaya dif3 dari konflik gabungan:

git config merge.conflictstyle diff3

Ini menciptakan penanda konflik seperti ini:

 <<<<<<< Changes made on the branch that is being merged into. In most cases, this is the branch that I have currently checked out (ie HEAD). ||||||| The common ancestor version. ======= Changes made on the branch that is being merged in. This is often a feature/topic branch. >>>>>>> 

Bagian tengah adalah bagaimana nenek moyang yang sama terlihat. Ini berguna karena Anda dapat membandingkannya dengan versi atas dan bawah untuk lebih memahami apa yang telah diubah di setiap cabang, memberi Anda gagasan yang lebih baik tentang apa tujuan dari setiap perubahan itu.

Jika konflik hanya terdiri dari beberapa baris, ini, sebagai suatu peraturan, membuat konflik menjadi sangat jelas. (Mengetahui cara memperbaiki konflik sangat berbeda: Anda perlu tahu apa yang sedang dikerjakan orang lain. Jika Anda bingung, sebaiknya panggil orang ini di kamar Anda sehingga mereka dapat melihat apa yang Anda cari.)

Jika konflik lebih panjang, saya memotong dan menempelkan masing-masing dari tiga bagian menjadi tiga file terpisah, seperti "milikku", "umum", dan "mereka".

Kemudian saya dapat menjalankan perintah berikut untuk melihat dua situasi yang menyebabkan konflik:

 diff common mine diff common theirs 

Ini tidak sama dengan menggunakan alat gabung, karena alat gabung akan menyertakan semua bunar yang tidak bertentangan. Saya menemukan itu mengganggu.

Kiat kedua

Seseorang telah menyebutkan hal ini, tetapi memahami maksud di balik setiap kata beda biasanya berguna untuk memahami dari mana konflik berasal dan bagaimana cara menanganinya.

 git log --merge -p <name of file> 

Ini menunjukkan semua komit yang terkait file ini antara leluhur yang sama dan dua kepala yang Anda gabungkan. (Dengan demikian, itu tidak termasuk komitmen yang sudah ada di kedua cabang sebelum penggabungan.) Ini membantu untuk mengabaikan perbedaan yang jelas bukan merupakan faktor dalam konflik Anda saat ini.

Kiat tiga

Periksa perubahan Anda dengan alat otomatis.

Jika Anda memiliki tes otomatis, jalankan. Jika Anda memiliki serat , jalankan. Jika itu adalah proyek konstruksi, maka itu harus dibangun sebelum Anda menyelesaikannya, dll. Dalam semua kasus, Anda perlu melakukan sedikit pengujian untuk memastikan bahwa perubahan Anda tidak rusak. (Heck, bahkan penggabungan tanpa konflik dapat merusak kode kerja.)

Kiat empat

Rencanakan ke depan; berkomunikasi dengan kolega.

Merencanakan ke depan dan menyadari bahwa orang lain bekerja dapat membantu mencegah konflik merger dan / atau membantu menyelesaikannya lebih awal - sementara detailnya masih relevan.

Misalnya, jika Anda tahu bahwa Anda dan orang lain sedang mengerjakan refactor berbeda yang akan memengaruhi set file yang sama, Anda harus berbicara satu sama lain sebelumnya dan lebih memahami jenis perubahan apa yang Anda lakukan. Anda dapat menghemat banyak waktu dan usaha jika Anda melakukan perubahan yang direncanakan pada gilirannya, dan tidak secara paralel.

Untuk refactor besar yang melintasi sebagian besar kode, Anda harus secara serius mempertimbangkan untuk bekerja secara berurutan: semua orang berhenti mengerjakan area kode ini, dan satu orang melakukan refactoring penuh.

Jika Anda tidak dapat bekerja secara konsisten (mungkin karena tekanan sementara), maka berbicara tentang konflik gabungan yang diharapkan setidaknya akan membantu Anda memecahkan masalah lebih awal, sementara detailnya masih segar. Misalnya, jika seorang karyawan membuat serangkaian komitmen yang merusak dalam satu minggu, Anda mungkin ingin menggabungkan / mengemas kembali cabang ini sekali atau dua kali sehari minggu ini. Dengan begitu, jika Anda menemukan gabungan / mengarahkan konflik, Anda dapat menyelesaikannya lebih cepat daripada jika Anda menunggu beberapa minggu untuk menggabungkan semuanya menjadi satu bagian besar.

Kiat lima

Jika Anda tidak yakin tentang merger, jangan memaksakannya.

Penggabungan bisa sangat berat, terutama ketika ada banyak file yang saling bertentangan, dan penanda konflik menjangkau ratusan baris. Seringkali, ketika mengevaluasi proyek perangkat lunak, kami tidak memasukkan cukup waktu untuk biaya tambahan, seperti memproses merger gila, jadi rasanya seperti resistensi nyata untuk menghabiskan beberapa jam menganalisis setiap konflik.

Dalam jangka panjang, perencanaan ke depan dan realisasi bahwa orang lain bekerja adalah alat terbaik untuk memprediksi konflik merger dan mempersiapkan solusi yang tepat dalam waktu yang lebih singkat.

696
29 сент. Jawabannya diberikan oleh Mark E. Haase 29 sep. 2011-09-29 00:08 '11 pada 0:08 2011-09-29 00:08
  • Tentukan file mana yang bertentangan (Git harus memberi tahu Anda ini).

  • Buka setiap file dan pelajari perbedaannya; Git membatasi mereka. Saya harap akan jelas versi mana dari setiap blok untuk disimpan. Anda mungkin harus mendiskusikan ini dengan pengembang lain yang telah menyelesaikan kode.

  • Setelah Anda menyelesaikan konflik dalam file git add the_file .

  • Segera setelah Anda menyelesaikan semua konflik, jalankan git rebase --continue atau perintah apa pun yang dikatakan Git saat selesai.

326
02 окт. jawabannya diberikan davetron5000 02 Oktober. 2008-10-02 15:41 '08 pada 15:41 2008-10-02 15:41

Periksa jawaban dalam pertanyaan Abort Git Cancelled , terutama Jawaban Charles Bailey , yang menunjukkan cara melihat berbagai versi file masalah, misalnya

100
03 окт. Balas diberikan oleh Pat Notz pada 03 Oktober 2008-10-03 18:15 '08 pada pukul 18:15 2008-10-03 18:15

Penggabungan konflik terjadi ketika perubahan dilakukan pada file secara bersamaan. Inilah cara mengatasinya.

git CLI

Berikut adalah >

  • Perhatikan daftar file-file yang saling bertentangan: git status (di bagian Unmerged paths ).
  • Atasi konflik secara terpisah untuk setiap file dengan salah satu pendekatan berikut:

    • Gunakan GUI untuk menyelesaikan konflik: git mergetool (cara termudah).

    • Untuk menerima versi remote / lainnya, gunakan: git checkout --theirs path/file . Ini akan menolak setiap perubahan lokal yang Anda buat pada file ini.

    • Untuk menerima versi lokal / kami, gunakan: git checkout --ours path/file

      Namun, Anda harus berhati-hati, karena perubahan yang dihapus telah dihi>

      Terkait: Apa arti sebenarnya dari "kita" dan "mereka" di git?

    • Edit file yang bertentangan secara manual dan cari blok kode antara <<<<< / >>>>> , lalu pilih versi di atas atau di bawah ===== . Lihat: Bagaimana konflik disajikan .

    • Konflik jalur dan nama file dapat diselesaikan dengan git add / git rm .

  • Terakhir, tinjau file yang siap untuk dikomit menggunakan: git status .

    Jika Anda masih memiliki file di bawah Unmerged paths , dan Anda telah menyelesaikan konflik secara manual, maka beri tahu Git bahwa Anda telah menyelesaikannya: git add path/file .

  • Jika semua konflik berhasil diselesaikan, salin perubahannya: git commit -a dan klik yang terhapus seperti biasa.

Lihat juga: Mengatasi konflik gabungan dari baris perintah di GitHub

DiffMerge

Saya telah berhasil menggunakan DiffMerge , yang secara visual dapat membandingkan dan menggabungkan file di Windows, macOS dan Linux / Unix.

Secara grafis menampilkan perubahan antara 3 file dan memungkinkan penggabungan otomatis (saat aman) dan kontrol penuh atas pengeditan file yang dihasilkan.

2019

05 авг. jawabannya diberikan kenorb 05 agustus . 2015-08-05 17:29 '15 pada 17:29 2015-08-05 17:29

Jika Anda sering melakukan commit kecil, mulailah dengan melihat komentar komit dengan git log --merge . Kemudian git diff akan menampilkan Anda konflik.

Untuk konflik yang melibatkan banyak baris, lebih mudah untuk melihat apa yang terjadi di alat GUI eksternal. Saya suka opendiff - Git juga mendukung vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box, dan Anda dapat menginstal yang lain: git config merge.tool "your.tool" menginstal alat yang Anda pilih dan kemudian git mergetool setelah gagal penggabungan akan menunjukkan perbedaan dalam konteks.

Setiap kali Anda mengedit file untuk menyelesaikan konflik, git add filename memperbarui indeks, dan diff Anda tidak akan lagi menampilkannya. Ketika semua konflik telah diproses dan file-file mereka telah git add git commit , git commit akan menyelesaikan penggabungan.

75
02 окт. Jawabannya diberikan oleh Paul 02 Okt 2008-10-02 19:11 '08 pada 19:11 2008-10-02 19:11

Lihat Bagaimana Konflik Disajikan atau di Git, dokumentasi git merge , untuk memahami apa itu penanda konflik konflik.

Selain itu, bagian Cara mengatasi konflik menjelaskan cara menyelesaikan konflik:

Setelah melihat konflik, Anda dapat melakukan dua hal:

  • Putuskan untuk tidak bergabung. Satu-satunya pembersih yang Anda butuhkan adalah file indeks reset untuk memperbaiki HEAD untuk inverse transform 2. dan untuk membersihkan perubahan desa kerja yang dilakukan pada 2. dan 3; git merge --abort dapat digunakan untuk ini.

  • Atasi konflik. Git akan menandai konflik di pohon kerja. Edit file dalam bentuk dan git add ke indeks. Gunakan git commit untuk menyegel transaksi.

Anda dapat bekerja dalam konflik dengan beberapa alat:

  • Gunakan mergetool. git mergetool untuk menjalankan mergetool grafis yang akan bekerja melalui gabungan.

  • Lihatlah perbedaannya. git diff menampilkan git diff tiga sisi, menyoroti perubahan dari versi HEAD dan MERGE_HEAD .

  • Lihatlah perbedaan antara masing-masing cabang. git log --merge -p <path> akan menampilkan diff pertama untuk versi HEAD dan kemudian versi MERGE_HEAD .

  • Lihatlah yang asli. git show :1:filename menunjukkan leluhur yang sama, git show :2:filename menunjukkan versi HEAD , dan git show :3:filename menunjukkan versi MERGE_HEAD .

Anda juga dapat membaca tentang merek konflik gabungan dan cara menyelesaikannya di bagian Konflik Penggabungan Pro Git .

43
14 июля '13 в 21:34 2013-07-14 21:34 jawabannya diberikan oleh user456814 14 Juli '13 pada 21:34 2013-07-14 21:34

Untuk Emacs, pengguna yang ingin menyelesaikan konflik penggabungan semi-manual:

 git diff --name-status --diff-filter=U 

Menampilkan semua file yang memerlukan resolusi konflik.

Buka masing-masing file ini satu per satu atau sekaligus:

 emacs $(git diff --name-only --diff-filter=U) 

Saat mengunjungi buffer yang membutuhkan pengeditan di Emacs, masukkan

 ALT+x vc-resolve-conflicts 

Ini akan membuka tiga buffer (milikku, mereka dan buffer output). Navigasi dengan menekan "n" (area berikutnya), "p" (area prediksi). Tekan "a" dan "b" untuk menyalin masing-masing area saya atau Anda ke buffer output. Dan / atau edit buffer output secara >

Setelah selesai: tekan "q". Emacs bertanya apakah Anda ingin menyimpan buffer ini: ya. Saat buffer selesai, tandai sebagai terselesaikan pada saat peluncuran dari kastor:

 git add FILENAME 

Setelah selesai bekerja dengan semua jenis buffer

 git commit 

untuk menyelesaikan penggabungan.

36
23 февр. jawabannya diberikan eci 23 Feb. 2013-02-23 02:04 '13 pada 2:04 2013-02-23 02:04

Saya ingin versi saya atau versi mereka sepenuhnya, atau saya ingin melihat perubahan individu dan membuat keputusan untuk masing-masing.

Sepenuhnya menerima versi saya atau mereka :

Terima versi saya (lokal, kami):

 git checkout --ours -- <filename> git add <filename> # Marks conflict as resolved git commit -m "merged bla bla" # An "empty" commit 

Terima versinya (dihapus):

 git checkout --theirs -- <filename> git add <filename> git commit -m "merged bla bla" 

Jika Anda ingin melakukannya untuk semua file yang bertentangan, jalankan:

 git merge --strategy-option ours 

atau

 git merge --strategy-option theirs 

Tinjau semua perubahan dan terima satu per satu.

  1. git mergetool
  2. Tinjau perubahan dan terima versi apa pun untuk masing-masingnya.
  3. git add <filename>
  4. git commit -m "merged bla bla"

Secara default, mergetool berfungsi di baris perintah . Cara menggunakan baris perintah mergetool harus menjadi masalah tersendiri.

Anda juga dapat menginstal alat visual untuk ini, misalnya, meld dan jalankan

 git mergetool -t meld 

Versi lokal (kami), "dasar" atau "bersatu" (hasil penggabungan saat ini) dan jarak jauh akan dibuka. Simpan versi gabungan setelah selesai, jalankan git mergetool -t meld sampai Anda mendapatkan "Tidak perlu menggabungkan file", kemudian lanjutkan ke >

28
29 сент. Jawabannya diberikan oleh Noidea 29 September . 2016-09-29 16:02 '16 pada 16:02 2016-09-29 16:02

Harap selesaikan >

  1. Periksa Status Git : Status Git

  2. Dapatkan set patch: git fetch (periksa patch yang benar dari git commit Anda)

  3. Ekstrak cabang lokal (dalam contoh saya, temp1): git checkout -b temp1

  4. Ekstrak konten terbaru dari master: git pull - master asal asal

  5. Jalankan mergetool, periksa konflik dan perbaiki ... dan periksa perubahan di cabang jarak jauh dengan cabang Anda saat ini: git mergetool

  6. Periksa lagi statusnya: status git

  7. Hapus file yang tidak perlu yang dibuat secara lokal dengan mergetool, biasanya mergetool membuat file tambahan dengan ekstensi * .orig. Hapus file ini, karena ini hanya duplikat, perbaiki perubahan secara lokal dan tambahkan versi file Anda yang benar. git tambahkan #Anda_changed_correct_files

  8. Periksa lagi statusnya: status git

  9. Komit perubahan ke pengidentifikasi yang sama (ini menghindari satu set perbaikan terpisah yang baru): git commit --amend

  10. Cabang push to master: git push (ke repositori Git Anda)

28
16 апр. Jawabannya diberikan Chhabilal 16 April. 2015-04-16 10:02 '15 pada 10:02 2015-04-16 10:02