Git tüm dosyalar için --ours / - onlarınkini kullanarak çakışmayı çözümleyin


113

Ödeme kullanan tüm dosyalar için çatışmayı çözmek için bir yol var mı --oursve --theirs? Bunu tek tek dosyalar için yapabileceğinizi ancak herkes için yapmanın bir yolunu bulamadığınızı biliyorum.


7
Çalışıyor mu git checkout --ours -- .? Bu ., çalışma dizini kökünden uygulandığında geçerli dizin anlamına gelir, bu nedenle temelde tüm çalışma dizini anlamına gelir. Bunun --oursbayrakla çalışıp çalışmayacağından emin değilim ve silinen veya yeniden adlandırılan dosya çakışmalarını nasıl ele alacağından emin değilim.

@Cupcake Başarıyla kullandım. Belki bu bir cevap olmalı?
Pedro Gimeno

Yanıtlar:


90

Sadece çalışma dizininde gezinin ve çıktıyı xargs komutuyla gönderin:

grep -lr '<<<<<<<' . | xargs git checkout --ours

veya

grep -lr '<<<<<<<' . | xargs git checkout --theirs

Bu nasıl çalışır: grepgeçerli dizindeki ( .) ve alt dizinlerdeki ( -rbayrak) her dosyada çakışma işaretlerini ('<<<<<<<') arayarak tekrar tekrar arayacaktır.

-lveya --files-with-matchesbayrak çıkışına dize bulunmuştur sadece dosya adını grep neden olur. Tarama, ilk eşleşmeden sonra durur, bu nedenle her eşleşen dosya yalnızca bir kez çıkarılır.

Eşleşen dosya isimleri sonra edilir borulu için Xargs için tek tek argümanları içine giriş akışı, kırar borulu bir yardımcı git checkout --oursya da--theirs

Bu bağlantıda daha fazlası .

Bunu her seferinde komut satırına yazmanız çok sakıncalı olacağından, kendinizi çok fazla kullanıyorsanız , seçtiğiniz kabuğunuz için bir takma ad oluşturmak kötü bir fikir olmayabilir : Bash olağan olanıdır. .

Bu yöntem, en az Git 2.4.x sürümlerinde çalışmalıdır.


15
Grpping yerine kullanmanın da mümkün olduğunu düşünüyorum git diff --name-only --diff-filter=U.
Tay

10
Ayrıca git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Büyük bir projeniz varsa grep etmekten daha hızlı.
joshbodily

1
@joshbodily Güzel. Bir fark göreceğim kadar büyük projelerim yok, ancak özellikle dizindeki toplam sayıya kıyasla birkaç dosya değişmişse, bunun nasıl daha hızlı olacağını görebiliyorum - ki bu normal durumda taahhüt eder.
Dmitri

1
Bunun, çatışmaları yeniden adlandırmak / yeniden adlandırmak için çalışmadığını unutmayın, örneğin,CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard

1
Yine başka bir seçenek: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax

52

Şunları yapabilirsiniz -Xoursya -Xtheirsile git mergede. Yani:

  1. mevcut birleştirmeyi iptal et (örneğin ile git reset --hard HEAD)
  2. tercih ettiğiniz stratejiyi kullanarak birleştirin ( git merge -Xoursveya git merge -Xtheirs)

SORUMLULUK REDDİ: Tabii ki tek bir seçenek seçebilirsin, ya -Xoursda -Xtheirsfarklı bir strateji kullanabilirsin, tabii ki dosyaya göre gitmelisin.

Bunun bir yolu var mı bilmiyorum checkout, ama gerçekten çok yararlı olduğunu düşünmüyorum: farklı dosyalar için farklı çözümler istiyorsanız, checkout komutuyla stratejiyi seçmek yararlıdır, aksi takdirde sadece birleştirme stratejisi yaklaşımını tercih edin.


Teşekkürler, birleştirmek için "- senin" ve "onların" olduğunu bilmiyordum. Görünüşe göre birleştirme için bunlar aslında '-s' stratejisinin bir parçası değil, '-X' özyinelemeli seçeneklerinin bir parçası. Bizim '-s' sürümümüz aslında tüm dosyaları birleştirmeden değiştirir ve onlarınki yoktur.
exe163

Hiçbir yoktur --theirsya --oursgit v1.9.4 için -Seçeneği. Bir yaklaşım olurdu git merge -s recursive -Xtheirs BRANCH.
fbmd

--theirsve --oursgit ile kullanılamaz 2.2.0. Ya cevabım kesin değildi ya da daha eski git sürümünde mevcuttu (bu cevap BT çağında oldukça eskidir). Doğru yaklaşım ile -X. Buna göre güncelleme
yapıyorum

Sürüm 2.4.0 itibariyle - sizin ve --kendileri hala çok fazla kullanılabilir git-scm.com/docs/git-checkout
Dmitri

Bunu denedim ve "otomatik birleştirme başarısız oldu, çakışmaları düzeltin". Bu komut açıkça tasarlandığı gibi çalışmıyor ve bundan kaçınmanızı tavsiye ederim - çok hatalı.
Adam

38

git checkout --[ours/theirs] .tüm çatışmaların kökeninde olduğunuz sürece istediğinizi yapacaksınız. bizimki / onlarınki yalnızca birleştirilmemiş dosyaları etkiler, bu nedenle özellikle çatışmaları grep / find / etc zorunda kalmamalısınız.


5
Benim için bu, alt dizinlere dönüşmüyor gibi görünüyor.
Daniel Baughman

5
Anlıyorum error: path 'foo/bar/blah' does not have our version.
Robin Green

Git 2.16.2.windows.1 sürümünü kullanıyorum ve benim için mükemmel çalışıyor. Teşekkürler!
Pankwood

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

İşi yapıyor gibi görünüyor. Bunu başarmak için git deposunun kök dizinine cd'lenmeniz gerektiğine dikkat edin.


3
Bence bu en çok oylananlardan daha iyi bir cevap çünkü (1) sadece çalışma dizini için değil tüm dosyalar için geçerli; ve (2) çatışma belirteçleri için grepping etrafında herhangi bir kırılganlık olmayacaktır. Buradaki 'git diff' komutu, tüm birleştirilmemiş yolları listeler, ki bu tam olarak kontrol etmek istediğimiz şeydir.
bchurchill

Güzel! Çatışma belirteçlerinin güvenilirliği konusunda her zaman endişeliydim grep
00-BBB


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Bu işlevi .zshrc dosyasına ekledim .

Bunları şu şekilde kullanın: gitcheckoutall theirsveyagitcheckoutall ours

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.