Bagaimana cara menyelesaikan konflik git gabung yang mendukung perubahan yang ditarik?
Pada dasarnya saya perlu menghapus semua perubahan yang bertentangan dari pohon yang berfungsi tanpa harus melalui semua konflik dengan git mergetool
sementara menjaga semua perubahan bebas konflik. Lebih disukai melakukan ini sambil menarik, bukan sesudahnya.
git
git-merge
git-merge-conflict
sanmai
sumber
sumber
Jawaban:
Atau, cukup, untuk repositori default:
Jika Anda sudah dalam keadaan konflik ...
sumber
-s recursive
sini berlebihan, karena itulah strategi penggabungan default. Jadi Anda bisa menyederhanakannyagit pull -X theirs
, yang pada dasarnya setara dengangit pull --strategy-option theirs
.MERGING
negara bagian. Saya bisa lalugit merge --abort
mencoba lagi, tetapi setiap kali saya berakhir dengan penggabungan. ... Saya tahu bahwa rebase didorong ke hulu saya, jadi mungkin itu yang menyebabkan ini?git checkout --theirs path/to/file
. Digunakan saat rebase dan mendapat hasil yang tidak terduga. Ditemukan penjelasan dalam dokumen: Perhatikan bahwa selama git rebase dan git pull --rebase, kita dan mereka mungkin tampak bertukar; --our memberikan versi dari cabang perubahan yang dirubah kembali, sementara --theirs memberikan versi dari cabang yang menahan pekerjaan Anda yang sedang direstrukturisasi.git checkout --theirs/--ours path
halaman manual menyatakan bahwa itu berfungsi untuk jalur yang tidak di-emergasi . Jadi jika tidak ada konflik di jalan, sudah digabungkan perintah ini tidak akan melakukan apa-apa. Ini dapat menyebabkan masalah ketika Anda ingin misalnya versi 'mereka' dari seluruh sub-folder. Jadi dalam kasus seperti itu akan lebih aman untuk melakukangit checkout MERGE_HEAD path
atau menggunakan hash komit.git pull -X theirs
membuat komit gabungan jika ada konflik (mis. jika committer lain larigit push -f
ke remote). Jika Anda tidak ingin menggabungkan komit, jalankan sajagit fetch && git reset --hard origin/master
.Anda dapat menggunakan opsi strategi "mereka" rekursif :
git merge --strategy-option theirs
Dari pria itu :
Catatan: seperti yang dikatakan halaman manual, "kita" bergabung opsi strategi sangat berbeda dari strategi gabungan "milik kami" .
sumber
git checkout --theirs
untuk beroperasi pada satu file yang saling bertentangangit checkout <ref to theirs> -- the/conflicted.file
; dan kemudiangit add
perubahan mereka.Jika Anda sudah dalam keadaan konflik, dan Anda ingin menerima saja :
Jika Anda ingin melakukan yang sebaliknya:
Ini sangat drastis, jadi pastikan Anda benar-benar ingin menghapus semuanya seperti ini sebelum melakukannya.
sumber
.
dan tentukan file sebagai pengganti titik yang ingin Anda checkout. kurang "drastis" & persis apa yang ingin Anda lakukan, mungkin.git add -u
sebaliknya untuk melewati file yang tidak di bawah kontrol versi.OK jadi, bayangkan skenario saya tadi:
Anda mencoba
merge
, atau mungkincherry-pick
, dan Anda dihentikanSekarang, Anda melihat file yang konflik dan Anda benar-benar tidak ingin menyimpan perubahan Anda. Dalam kasus saya di atas, file tersebut bentrok hanya pada baris baru IDE saya telah ditambahkan secara otomatis. Untuk membatalkan perubahan Anda dan menerimanya, cara termudah adalah:
Kebalikan dari ini (untuk menimpa versi yang masuk dengan versi Anda) adalah
Anehnya, saya tidak dapat menemukan jawaban ini dengan mudah di Internet.
sumber
git status
antaracheckout
danadd
, file masih ditampilkan sebagai "keduanya dimodifikasi".git reset --hard
dan kemudiangit pull [remote server name] [branch name] -Xtheirs
(membatalkan penggabungan kemudian menarik barang baru di atas barang saya) - tidak yakin apakah ini yang Anda inginkan.The
git pull -X theirs
jawaban dapat membuat merge jelek komit, atau menerbitkanJika Anda ingin mengabaikan modifikasi lokal untuk file dari repo, misalnya pada klien yang harus selalu menjadi cermin asal, jalankan ini (ganti
master
dengan cabang yang Anda inginkan):Bagaimana cara kerjanya?
git fetch
tidakgit pull
tetapi tanpa penggabungan . Kemudiangit reset --hard
buat pohon kerja Anda cocok dengan komit terakhir. Semua perubahan lokal Anda ke file dalam repo akan dibuang , tetapi file lokal baru akan dibiarkan sendiri.sumber
git fetch && git reset --hard {remote}/{branch}
adalah yang memecahkan masalah saya. Saya harus benar-benar membuang perubahan saya sendiri demi status "mereka" cabang, tetapigit pull -X theirs
tersedak pada beberapa file yang dipindahkan / diganti nama. Terima kasih!Setelah git bergabung, jika Anda mendapatkan konflik dan Anda ingin Anda atau mereka
sumber
Untuk menyelesaikan semua konflik dengan versi di cabang tertentu:
Jadi, jika Anda sudah dalam status penggabungan, dan Anda ingin menyimpan versi master dari file yang bertentangan:
sumber
git cherry-pick --continue
atau satugit commit --allow-empty
perintah untuk melakukan perubahan ini, dan tampaknya tidak ada sistem di belakang yang diperlukan perintah, yang membuat mengotomatisasi ini menyusahkan. Saat ini saya sedang memecahkan ini dengan menguji keberadaan.git/COMMIT_EDITMSG
file tetapi itu tampak rapuh dan rapuh, dan saya belum yakin bahwa itu selalu berhasil.git add
) maka Anda dapat menyelesaikan sisanya melalui ini.git checkout --ours
Sayagit checkout --theirs
juga berguna.Harap jangan bahwa kadang-kadang ini tidak akan berhasil :
atau
Saya melakukan ini sebagai gantinya, dengan asumsi HEAD adalah milik kita dan MERGE_HEAD adalah milik mereka
atau:
Setelah kami melakukan ini dan kami baik-baik saja:
Jika Anda ingin lebih memahami, lihat posting torek yang indah di sini: git checkout --our tidak menghapus file dari daftar file yang tidak di-unmerged
sumber
Pengguna VS Code (integrated Git) IDE:
Jika Anda ingin menerima semua perubahan yang masuk dalam file konflik maka lakukan langkah-langkah berikut.
Demikian pula yang dapat Anda lakukan untuk opsi lain seperti Terima Semua Keduanya, Terima Semua Saat Ini dll,
sumber
Saya memiliki
next-version
cabang yang sudah berjalan lama dengan banyak penghapusan file yang telah berubahdevelop
, file yang telah ditambahkan di berbagai tempat di kedua cabang, dll.Saya ingin mengambil seluruh isi
next-version
cabangdevelop
, semuanya dalam satu komit gabungan.Kombinasi dari perintah di atas yang bekerja untuk saya adalah:
Bukan jawaban baru, hanya menggabungkan bit dari banyak jawaban, sebagian untuk meyakinkan bahwa Anda mungkin membutuhkan semua jawaban ini.
sumber
Jika Anda sudah dalam keadaan konflik, dan tidak ingin checkout jalur satu per satu. Anda boleh mencoba
sumber
Suatu situasi yang saya temukan berguna jika saya ingin master untuk mencerminkan perubahan cabang topik baru. Saya perhatikan bahwa -Xtheirs tidak bergabung tanpa konflik dalam beberapa keadaan ... misalnya
Dalam hal ini solusi yang saya temukan adalah
dari topicFoo, penggabungan pertama dalam master menggunakan strategi -s kita, ini akan membuat komit palsu yang hanya keadaan dari topicFoo. $ git merge -s master kita
periksa komit gabungan yang dibuat
sekarang checkout cabang utama
menggabungkan cabang topik kembali tetapi kali ini menggunakan strategi rekursif -Xtheirs, ini sekarang akan memberi Anda cabang utama dengan keadaan topicFoo.
sumber