Saya tidak ingin alat penggabungan visual, dan saya juga tidak ingin harus vi file yang konflik dan secara manual memilih antara KEPALA (milik saya) dan perubahan yang diimpor (milik mereka). Sebagian besar waktu saya ingin semua perubahan mereka atau semua milik saya. Biasanya ini adalah karena perubahan saya membuatnya naik turun dan kembali kepada saya melalui tarikan, tetapi mungkin sedikit dimodifikasi di berbagai tempat.
Apakah ada alat baris perintah yang akan menghilangkan penanda konflik dan memilih semua cara berdasarkan pilihan saya? Atau satu set perintah git yang bisa saya alias buat sendiri masing-masing.
# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"
Melakukan ini agak menyebalkan. Untuk 'menerima milikku' saya sudah mencoba:
randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.
randy@sabotage ~/linus $ git checkout Makefile
error: path 'Makefile' is unmerged
andy@sabotage ~/linus $ git reset --hard HEAD Makefile
fatal: Cannot do hard reset with paths.
Bagaimana saya bisa menyingkirkan spidol perubahan ini?
Dapat saya lakukan:
git reset HEAD Makefile; rm Makefile; git checkout Makefile
Tapi ini agaknya berputar, pasti ada cara yang lebih baik. Dan pada titik ini, saya tidak yakin apakah git bahkan berpikir penggabungan terjadi, jadi saya tidak berpikir ini bahkan berfungsi.
Sebaliknya, melakukan 'menerima milik mereka' sama berantakannya. Satu-satunya cara saya bisa mengetahuinya adalah melakukan:
git show test-branch:Makefile > Makefile; git add Makefile;
Ini juga memberi saya pesan komit kacau, yang memiliki Konflik: Makefile di dalamnya dua kali.
Dapatkah seseorang tolong tunjukkan bagaimana melakukan dua tindakan di atas dengan cara yang lebih sederhana? Terima kasih
Jawaban:
Solusinya sangat sederhana.
git checkout <filename>
mencoba memeriksa file dari indeks , dan karena itu gagal saat digabung.Yang perlu Anda lakukan adalah (yaitu checkout komit ):
Untuk checkout versi Anda sendiri, Anda dapat menggunakan salah satu dari:
atau
atau
Untuk checkout versi lain, Anda dapat menggunakan salah satu dari:
atau
atau
Anda juga perlu menjalankan 'tambah' untuk menandainya sebagai terselesaikan:
sumber
--ours
dan itu--theirs
berarti kebalikan dari apa yang saya pikir secara intuitif ketika mencoba perintah ini ...git show
- ini melompati normalisasi baris baru.--
digunakan oleh Git untuk memisahkan revisi (nama cabang dll.) Dari nama path (nama file, direktori). Penting jika Git tidak dapat memutuskan apakah nama adalah nama cabang atau nama file. Ini mengikuti konvensi POSIX (atau GNU) tentang penggunaan tanda hubung ganda untuk memisahkan opsi dari argumen (nama file).theirs
/ours
dapat ditukar jika Anda menyelesaikan konflik dalam konteks operasi rebase. Karena rebase bekerja dengan memeriksa cabang target kemudian memetik ceri melakukan dari cabang "Anda" ke target, perubahan yang masuk ("milik mereka") adalah dari cabang "Anda", dan cabang saat ini adalah cabang target ("milik kita" ).Coba ini:
Untuk menerima perubahan mereka:
git merge --strategy-option theirs
Untuk menerima milik Anda:
git merge --strategy-option ours
sumber
Berdasarkan jawaban Jakub Anda dapat mengkonfigurasi alias git berikut untuk kenyamanan:
Mereka secara opsional mengambil satu atau beberapa jalur file untuk diselesaikan dan default untuk menyelesaikan semuanya di bawah direktori saat ini jika tidak ada yang diberikan.
Tambahkan mereka ke
[alias]
bagian Anda~/.gitconfig
atau jalankansumber
[alias]
bagian dalam Anda~.gitconfig
atau gunakangit config --global accept-ours "..."
. Telah mengedit jawaban saya.~/.gitconfig
.!f() { git checkout --ours -- "${@:-.}" git add -u "${@:-.}; }; f
Berdasarkan jawaban kynan, berikut adalah alias yang sama, dimodifikasi sehingga mereka dapat menangani spasi dan tanda hubung awal dalam nama file:
sumber
Situasi ideal untuk menyelesaikan konflik adalah ketika Anda tahu sebelumnya tentang cara mana Anda ingin menyelesaikannya dan dapat melewati
-Xours
atau-Xtheirs
menggabungkan opsi strategi rekursif. Di luar ini, saya bisa melihat tiga scenarious:Untuk mengatasi tiga skenario ini, Anda dapat menambahkan baris berikut ke
.gitconfig
file Anda (atau yang setara):The
get(ours|theirs)
alat hanya terus versi masing dari file dan membuang semua perubahan dari versi lain (sehingga tidak ada penggabungan terjadi).The
merge(ours|theirs)
alat re-melakukan penggabungan tiga jalan dari lokal, dasar, dan versi jarak jauh dari file, memilih untuk menyelesaikan konflik di arah tertentu. Ini memiliki beberapa peringatan, khususnya: ia mengabaikan opsi diff yang diteruskan ke perintah penggabungan (seperti algoritma dan penanganan spasi putih); apakah penggabungan bersih dari file asli (sehingga setiap perubahan manual ke file tersebut dibuang, yang bisa baik atau buruk); dan memiliki keuntungan yang tidak dapat dikacaukan oleh spidol berbeda yang seharusnya ada dalam file.The
keep(ours|theirs)
alat hanya suntingan penanda diff dan bagian tertutup, mendeteksi mereka dengan ekspresi reguler. Ini memiliki keuntungan bahwa ia mempertahankan opsi-opsi diff dari perintah penggabungan dan memungkinkan Anda untuk menyelesaikan beberapa konflik dengan tangan dan kemudian secara otomatis menyelesaikan sisanya. Ini memiliki kelemahan bahwa jika ada penanda konflik lain dalam file itu bisa membingungkan.Ini semua digunakan dengan menjalankan di
git mergetool -t (get|merge|keep)(ours|theirs) [<filename>]
mana jika<filename>
tidak disediakan itu memproses semua file yang bertentangan.Secara umum, dengan asumsi Anda tahu tidak ada penanda berbeda untuk membingungkan ekspresi reguler,
keep*
varian dari perintah adalah yang paling kuat. Jika Anda membiarkanmergetool.keepBackup
opsi tidak disetel atau benar, maka setelah penggabungan, Anda dapat melakukan diff*.orig
file terhadap hasil penggabungan untuk memeriksa apakah masuk akal. Sebagai contoh, saya menjalankan yang berikut setelahmergetool
hanya untuk memeriksa perubahan sebelum melakukan:Catatan : Jika
merge.conflictstyle
tidakdiff3
maka/^|||||||/
pola dalamsed
aturan harusnya sebagai/^=======/
gantinya.sumber