Apakah ada cara untuk menyelesaikan konflik untuk semua file menggunakan checkout --ours
dan --theirs
? Saya tahu bahwa Anda dapat melakukannya untuk file individual tetapi tidak dapat menemukan cara untuk melakukannya untuk semua.
Apakah ada cara untuk menyelesaikan konflik untuk semua file menggunakan checkout --ours
dan --theirs
? Saya tahu bahwa Anda dapat melakukannya untuk file individual tetapi tidak dapat menemukan cara untuk melakukannya untuk semua.
Jawaban:
Cukup grep melalui direktori kerja dan kirim hasilnya melalui perintah xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
atau
grep -lr '<<<<<<<' . | xargs git checkout --theirs
Bagaimana ini bekerja: grep
akan mencari melalui setiap file di direktori saat ini (the .
) dan subdirektori secara rekursif ( -r
bendera) mencari penanda konflik (string '<<<<<<<')
yang -l
atau --files-with-matches
bendera menyebabkan grep untuk output hanya nama file di mana string ditemukan. Pemindaian berhenti setelah kecocokan pertama, jadi setiap file yang cocok hanya dikeluarkan satu kali.
Nama file yang cocok kemudian disalurkan ke xargs , sebuah utilitas yang memecah aliran input yang disalurkan menjadi argumen individu untuk git checkout --ours
atau--theirs
Selengkapnya di tautan ini .
Karena akan sangat merepotkan jika harus mengetik ini setiap kali di baris perintah, jika Anda sering menggunakannya, mungkin bukan ide yang buruk untuk membuat alias untuk shell pilihan Anda: Bash adalah yang biasa .
Metode ini harus bekerja setidaknya melalui Git versi 2.4.x
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Lebih cepat dari grep jika Anda memiliki proyek besar.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Anda bisa -Xours
atau -Xtheirs
dengan git merge
juga. Begitu:
git reset --hard HEAD
)git merge -Xours
atau git merge -Xtheirs
)PENAFIAN: tentu saja Anda hanya dapat memilih satu opsi, -Xours
atau -Xtheirs
, gunakan strategi yang berbeda, Anda tentu saja harus membuka file demi file.
Saya tidak tahu apakah ada cara untuk itu checkout
, tetapi saya tidak benar-benar berpikir itu sangat berguna: memilih strategi dengan perintah checkout berguna jika Anda menginginkan solusi yang berbeda untuk file yang berbeda, jika tidak gunakan saja pendekatan strategi penggabungan.
--theirs
atau --ours
-Option untuk git v1.9.4. Pendekatan akan git merge -s recursive -Xtheirs BRANCH
.
--theirs
dan --ours
tidak tersedia juga dengan git 2.2.0
. Entah jawaban saya tidak tepat atau tersedia dalam versi git yang lebih lama (jawaban ini cukup lama di zaman TI). Pendekatan yang tepat adalah dengan -X
. Saya memperbarui sesuai
git checkout --[ours/theirs] .
akan melakukan apa yang Anda inginkan, selama Anda berada di akar semua konflik. ours / theirs hanya mempengaruhi file yang tidak digabungkan jadi Anda tidak perlu grep / menemukan / etc konflik secara khusus.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Sepertinya melakukan pekerjaan itu. Perhatikan bahwa Anda harus di-cd ke direktori root dari git repo untuk mencapai ini.
Jika ada orang lain yang ingin menimpa semuanya dari satu cabang (katakanlah master) dengan konten yang lain, ada cara yang lebih mudah:
git merge origin/master --strategy=ours
Terima kasih untuk https://stackoverflow.com/a/1295232/560114
Atau sebaliknya, lihat Apakah ada versi "mereka" dari "git merge -s ours"?
git checkout --ours -- .
bekerja? The.
berarti direktori saat ini, bila diterapkan dari akar direktori kerja, sehingga pada dasarnya berarti seluruh direktori kerja. Tidak yakin apakah itu akan berfungsi dengan--ours
bendera, dan saya tidak yakin bagaimana itu akan menangani konflik file yang dihapus atau diganti namanya.