Saya baru saja menggabungkan cabang ke master saya di git dan saya dapatkan Automatic merge failed; fix conflicts and then commit the result.
Sekarang saya berlari git mergetool
dan Viffiff dibuka dengan gambar di bawah ini. Saya tidak tahu cara menggunakan vimdiff. Apa arti setiap panel di sini dan bagaimana saya harus melanjutkan untuk memperbaiki konflik gabungan?
159
Jawaban:
Keempat buffer memberikan tampilan berbeda dari file yang sama. Buffer kiri atas (LOCAL) adalah bagaimana file terlihat di cabang target Anda (apa yang Anda gabungkan). Buffer kanan atas (REMOTE) adalah bagaimana file terlihat di cabang sumber Anda (tempat Anda bergabung). Penyangga tengah (BASE) adalah leluhur yang sama dari keduanya (sehingga Anda dapat membandingkan bagaimana versi kiri dan kanan berbeda satu sama lain).
Saya mungkin salah pada poin berikut. Saya pikir sumber konflik gabungan adalah bahwa kedua file telah mengubah bagian file yang sama sejak DASAR; LOCAL telah mengubah kuotasi dari dua kali lipat menjadi tunggal, dan REMOTE telah melakukan perubahan yang sama tetapi juga mengubah nilai latar belakang dari warna menjadi URL. (Saya pikir penggabungan ini tidak cukup pintar untuk memperhatikan bahwa semua perubahan pada LOCAL juga ada di REMOTE; ia hanya tahu bahwa LOCAL telah membuat perubahan sejak DASAR di tempat yang sama dengan REMOTE).
Bagaimanapun, buffer bawah berisi file yang benar-benar dapat Anda edit — file yang ada di direktori kerja Anda. Anda dapat membuat perubahan apa pun yang Anda suka;
vim
menunjukkan kepada Anda perbedaannya dari setiap tampilan teratas, yang merupakan area yang tidak dapat ditangani oleh penggabungan otomatis. Tarik perubahan dari LOCAL jika Anda tidak ingin perubahan REMOTE. Tarik perubahan dari REMOTE jika Anda lebih suka perubahan LOCAL. Tarik dari BASE jika Anda berpikir bahwa REMOTE dan LOCAL salah. Lakukan sesuatu yang sama sekali berbeda jika Anda memiliki ide yang lebih baik! Pada akhirnya, perubahan yang Anda lakukan di sini adalah yang benar-benar akan dilakukan.sumber
:x
atau:w
(:x
keluar juga) plus 'kembali'.vim
.@ chepner jawabannya bagus, saya ingin menambahkan beberapa detail pada "bagaimana saya melanjutkan untuk memperbaiki konflik gabungan" bagian dari pertanyaan. Jika Anda melihat bagaimana cara benar-benar menggunakan vimdiff dalam kasus ini, ini berlaku di bawah.
Pertama, untuk mengatasi opsi "batalkan semuanya" - jika Anda tidak ingin menggunakan "vimdiff" dan ingin membatalkan penggabungan: tekan Esc, lalu ketik
:qa!
dan tekan Enter. (lihat juga Bagaimana cara keluar dari editor Vim? ). Git akan bertanya apakah penggabungan telah selesai, balas dengann
.Jika Anda ingin menggunakan vimdiff, berikut adalah beberapa cara pintas yang bermanfaat. Ini mengasumsikan Anda tahu dasar-dasar Vim (navigasi dan masukkan / mode normal):
:diffget LO
:diffget RE
:diffget BA
:wqa
:cquit
: Bagaimana Anda membatalkan git diff eksternal?Tampaknya tidak mungkin untuk menambahkan bakhil konflik lokal dan jarak jauh tanpa menempelkan salinan atau pintasan khusus: /vi/10534/is-there-a-wayway-to-take-both- when-using-vim-as-merge-tool yang memalukan karena add add adalah tipe konflik yang umum.
Agar vimdiff tidak meminta Anda menekan enter setiap kali dimulai, tambahkan ke
.vimrc
:seperti yang disebutkan di: /vi/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode
Anda dapat mencari di Internet untuk pintasan vimdiff lainnya. Saya menemukan ini berguna: https://gist.github.com/hyamamoto/7783966
sumber
:diffget
.The mergetool utama untuk menggantikan vimdiff
Ini semacam lidah-di-pipi, tetapi akhirnya saya bertemu sebagai seorang vimmer setelah mencoba vimdiff.
Untuk menyelesaikan konflik gabungan, yang hampir selalu saya butuhkan adalah melihat:
untuk kemudian mencoba menyatukan keduanya.
Sementara vimdiff menampilkan BASE, LOCAL dan REMOTE di layar:
Saya tidak tahu bagaimana membuatnya dengan jelas menunjukkan dua perbedaan yang saya butuhkan selain dengan melihat ke kiri kanan ke kiri beberapa kali.
Selain itu, LOCAL dan REMOTE sudah terlihat di penanda konflik git merge, jadi saya tidak mendapatkan banyak dari alat yang menunjukkan mereka lagi.
Karena itu, saya malah membuat "difftool" kecil saya sendiri yang sebenarnya menunjukkan diffs yang saya lewatkan:
~ / bin / cirosantilli-mergetool
GitHub hulu .
Dan instal dengan:
Sekarang, ketika Anda melakukannya:
ini menunjukkan dua perbedaan yang saya inginkan di terminal, mis. sesuatu bersama:
Jadi Anda bisa lihat di sini dua diff yang dibuang ke terminal:
RealView_BASE_15560.py
vs.RealView_LOCAL_15560.py
RealView_BASE_15560.py
vs.RealView_REMOTE_15560.py
Jika perbedaannya besar, saya hanya akan mencari dengan kekuatan super tmux saya .
Ya, Anda kehilangan beberapa pintasan yang disediakan vimdiff, tetapi secara umum penyelesaian konflik memerlukan penyalinan yang hati-hati dari kedua versi, yang dapat saya lakukan dengan baik di dalam sesi vim normal dengan spidol git.
Mengamati dan membedakan file saat
vimdiff
sedang berjalanSebelum saya duduk dan otomatis setup sempurna saya dengan
cirosantilli-mergetool
, inilah yang saya lakukan untuk mendapatkan dua perbedaan yang saya butuhkan.Ketika
git mergetool
sedang berjalanvimdiff
, jika ada konflik pada file bernama, katakanmain.py
,, git menghasilkan file untuk setiap versi, dinamai sebagai:di direktori yang sama seperti
main.py
di mana1367
adalah PID dari mergetool git, dan karena itu "acak" integer, seperti yang disebutkan di: Dalam gabungan konflik git, apa CADANGAN, BASE, LOKAL, dan file REMOTE yang dihasilkan?Jadi, untuk melihat perbedaan yang saya inginkan, saya pertama-tama menemukan file yang dihasilkan
git status
, dan kemudian membuka terminal baru dan melakukan vimdiff antara pasangan file yang saya pedulikan:Bersama dengan
git mergetool
, informasi ini membantu BANYAK untuk mencari tahu apa yang sedang terjadi dengan cepat!Juga, bahkan ketika mergetool sedang berjalan, Anda bisa membuka file:
langsung dan edit di sana jika Anda merasa akan lebih mudah dengan jendela editor yang lebih besar.
Langsung langsung untuk menggabungkan konflik
Sementara
]c
melompat ke titik diff berikutnya di dalam vimdiff, tidak selalu ada konflik gabungan di sana.Untuk membantu ini, saya miliki di
~/.vimrc
:yang menemukan konflik secara langsung.
git imerge
Mungkin pilihan terbaik adalah menyerah menggunakan vimdiff dan mengandalkan vim + git imerge reguler yang disebutkan di: Bagaimana cara mengetahui Git yang melakukan konflik? karena kurva belajar vimdiff mengganggu, dan itu tidak melakukan fungsi yang paling kita butuhkan.
sumber