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.
112
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.Jawaban:
Cukup grep melalui direktori kerja dan kirim hasilnya melalui perintah xargs:
atau
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
sumber
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
dengangit merge
juga. Begitu:git reset --hard HEAD
)git merge -Xours
ataugit 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.sumber
--theirs
atau--ours
-Option untuk git v1.9.4. Pendekatan akangit merge -s recursive -Xtheirs BRANCH
.--theirs
dan--ours
tidak tersedia juga dengan git2.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 sesuaigit 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.sumber
error: path 'foo/bar/blah' does not have our version
.Sepertinya melakukan pekerjaan itu. Perhatikan bahwa Anda harus di-cd ke direktori root dari git repo untuk mencapai ini.
sumber
Jika ada orang lain yang ingin menimpa semuanya dari satu cabang (katakanlah master) dengan konten yang lain, ada cara yang lebih mudah:
Terima kasih untuk https://stackoverflow.com/a/1295232/560114
Atau sebaliknya, lihat Apakah ada versi "mereka" dari "git merge -s ours"?
sumber
Saya telah menambahkan fungsi ini dalam file .zshrc .
Gunakan dengan cara ini:
gitcheckoutall theirs
ataugitcheckoutall ours
sumber