Git menyelesaikan konflik menggunakan --ours / - milik mereka untuk semua file

112

Apakah ada cara untuk menyelesaikan konflik untuk semua file menggunakan checkout --oursdan --theirs? Saya tahu bahwa Anda dapat melakukannya untuk file individual tetapi tidak dapat menemukan cara untuk melakukannya untuk semua.

exe163
sumber
7
Apakah 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 --oursbendera, dan saya tidak yakin bagaimana itu akan menangani konflik file yang dihapus atau diganti namanya.
@Cupcake Saya telah berhasil menggunakannya. Mungkin itu harus menjadi jawaban?
Pedro Gimeno

Jawaban:

90

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: grepakan mencari melalui setiap file di direktori saat ini (the .) dan subdirektori secara rekursif ( -rbendera) mencari penanda konflik (string '<<<<<<<')

yang -latau --files-with-matchesbendera 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 --oursatau--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

Dmitri
sumber
14
Alih-alih grep, saya pikir itu juga mungkin untuk digunakan git diff --name-only --diff-filter=U.
Thai
10
Juga git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Lebih cepat dari grep jika Anda memiliki proyek besar.
joshbodily
1
@joshily Bagus. Saya tidak memiliki proyek yang begitu besar sehingga saya akan melihat perbedaannya, tetapi saya dapat melihat bagaimana itu akan jauh lebih cepat terutama jika beberapa file telah berubah dibandingkan dengan jumlah total dalam direktori ---- yang seharusnya menjadi kasus normal melakukan.
Dmitri
1
Perhatikan bahwa ini tidak berfungsi untuk mengganti nama / mengganti nama konflik, misalnya,CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard
1
Namun pilihan lain: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax
52

Anda bisa -Xoursatau -Xtheirsdengan git mergejuga. Begitu:

  1. batalkan penggabungan saat ini (misalnya dengan git reset --hard HEAD)
  2. gabungkan menggunakan strategi yang Anda sukai ( git merge -Xoursatau git merge -Xtheirs)

PENAFIAN: tentu saja Anda hanya dapat memilih satu opsi, -Xoursatau -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.

Terima kasih untuk semua ikan
sumber
Terima kasih, tidak tahu mereka memiliki '--kami' dan '--mereka' untuk digabungkan. Tampaknya untuk menggabungkan mereka sebenarnya bukan bagian dari strategi '-s' tetapi bagian dari opsi rekursif '-X'. Versi '-s' kami sebenarnya hanya menggantikan semua file tanpa penggabungan dan milik mereka tidak ada.
exe163
Tidak ada --theirsatau --ours-Option untuk git v1.9.4. Pendekatan akan git merge -s recursive -Xtheirs BRANCH.
fbmd
--theirsdan --ourstidak 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
ThanksForAllTheFish
Mulai Versi 2.4.0 --ours dan --mereka masih sangat banyak tersedia git-scm.com/docs/git-checkout
Dmitri
Mencoba ini, dan mendapatkan "penggabungan otomatis gagal, perbaiki konflik". Perintah ini jelas tidak berfungsi sebagaimana mestinya, dan saya sarankan untuk menghindarinya - terlalu buggy.
Adam
37

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.

Cory Petosky
sumber
5
Bagi saya, ini sepertinya tidak berulang menjadi subdirektori.
Daniel Baughman
5
Saya mengerti error: path 'foo/bar/blah' does not have our version.
Robin Green
Saya menggunakan git versi 2.16.2.windows.1 dan bekerja dengan sempurna untuk saya. Terima kasih!
Pankwood
30
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.

Peter
sumber
3
Saya pikir ini adalah jawaban yang lebih baik daripada jawaban yang dipilih teratas karena (1) ini berlaku untuk semua file, bukan hanya direktori kerja; dan (2) tidak akan ada kerapuhan di sekitar pencarian penanda konflik. Perintah 'git diff' di sini mencantumkan semua jalur yang tidak digabungkan, yang persis seperti yang ingin kita periksa.
bchurchill
Bagus! Saya selalu prihatin tentang keandalan penanda konflik grep
00-BBB
2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Saya telah menambahkan fungsi ini dalam file .zshrc .

Gunakan dengan cara ini: gitcheckoutall theirsataugitcheckoutall ours

iWheelBuy
sumber