Git'te çakışan dosyaları listelemenin en basit yolu nedir?


692

Sadece çakışan dosyaların düz bir listesine ihtiyacım var .

Şundan daha basit bir şey var mı:

git ls-files -u  | cut -f 2 | sort -u

veya:

git ls-files -u  | awk '{print $4}' | sort | uniq

Sanırım bunun için kullanışlı bir kurulum yapabilirdim alias, ancak profesyonellerin nasıl yaptığını merak ediyordum. Ben Belki vb otomatik çözümleme çatışmaya döngüler örneğin kabuk yazma içine takarak bu döngü yerine kullanmak istiyorum mergetool.cmd?


2
git rebase --continue(varsa) çakışmalı dosyaları listeler
jacob

git durumu yeterli
Amruth A

1
Çakışan birleştirme oturumunda `git merge --continue` çakışan liste dosyalarını gösterir.
Jayan

git rebase --continueçatışmaları listelemedim, sadece onları düzeltmemi söyledim (git sürüm 2.21.0)
Gary

Yanıtlar:


1212
git diff --name-only --diff-filter=U

131
Bunun için bir takma ad oluşturdum:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey, bir şey mi kaçırıyorum? Ne var yanlış ile git status?
Pacerier

8
@ Pacer, sadece daha karışık. Milyonlarca çelişkili birleştirme ve bir çelişkili birleşme varsa, çıktı için özlü bir şey istersiniz.
xster

8
@sAguinaga: Sadece koşmakgit conflicts
Jimothy

1
Bu, çakışmayı çözdükten sonra bile dosyayı göstermeye devam eder. git diff --checkdaha iyi çalışır.
user3812377

64

git diff --check

satır numaraları da dahil olmak üzere çakışma işaretleri içeren dosyaların listesini gösterir .

Örneğin:

> git diff --check
index-localhost.html:85: leftover conflict marker
index-localhost.html:87: leftover conflict marker
index-localhost.html:89: leftover conflict marker
index.html:85: leftover conflict marker
index.html:87: leftover conflict marker
index.html:89: leftover conflict marker

kaynak: https://ardalis.com/detect-git-conflict-markers


1
git diff --checkSondaki boşluk gibi diğer (daha az ciddi) problemlerden bahsettiğimi buldum , bu yüzden git diff --check | grep -i conflictOP'nin davası için bir durum olabilir
CCJ

37

Soruma cevap vermeye çalışıyorum:

Hayır, sorudaki kutudan daha basit bir yol yok gibi görünüyor.

Bunu çok kez yazdıktan sonra, daha kısa olanı git için erişilebilir hale getirilen 'git-çakışmaları' adlı yürütülebilir bir dosyaya yapıştırdım, şimdi sadece: git conflictsİstediğim listeyi almak için.

Güncelleme: Richard'ın önerdiği gibi, yürütülebilir dosyaya alternatif olarak bir git takma adı ayarlayabilirsiniz

git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'

Diğer ad üzerinde yürütülebilir dosyayı kullanmanın bir avantajı, bu komut dosyasını ekip üyeleriyle (repo'nun bin dir kısmında) paylaşabilmenizdir.


1
O noktada da aynı şeyi hissettim - insanların buna nasıl ihtiyacı olmadığını düşünmek ve geçici çözümün ne kadar önemsiz olduğunu görmek. Ancak, 2 yıldır git kullanıyorum ve dürüstçe bu "sınırlama" bir kez daha karşılaşmadım. Sonuçta belki de bu kadar yaygın bir kullanım alanı değil mi?
14'te inger

4
Bu, bunun için bir takma ad ayarlayabileceğiniz kadar basittir git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(!, Bir git komutu yerine bu kabuk komutunu çalıştırmak anlamına gelir).
Richard

1
"Çift tırnak" yerine "tek tırnak" istediğinizi belirtmek gerekir. Aksi takdirde, !kabuk tarafından yorumlanacaktır:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop

26

İşte aptalca bir yol:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir

9
Hayır. Git'in dizini, dosyalardaki metin işaretleyicileri kaldırıldıktan sonra bile bazı dosyaları dahili olarak çakışıyor olarak işaretler.
Alexander Bird

7
Alexander'ın yorumunun yanı sıra, bunu bir seçenek olarak görmek hala yararlı :) Lütfen silmeyin.
WoodenKitty

3
Veya mevcut çalışma dizininde çalıştırmak için yol için bir nokta kullanın -grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, bu benim de bunu yapma şeklim. Güzel bir cşekilde eklemek de çatışmaların sayısını artırır! Bir not, bu -Hrnda satır numarası bilgileri sağlayacak bayrakları kullanmak olacaktır.
ShellFish

3
Eğer regex kullanıyorsanız, [<=>]{7}bunun yerine öneririm . (Bunun grep'te -Eçalışması için bayrağa ihtiyacı olabilir .) Veya, <{7}birleştirme işaretleyicilerini sarkmaktan endişe etmiyorsanız veya çatışmaları saymak istiyorsanız. (Ayrıca kullanabilirsiniz git grep- o zaman -rbayrağı gerekmez .)
celticminstrel

22

git status "değiştirilmiş" veya "yeni dosya" vb. yerine çakışan dosyaların yanında "her ikisi de değiştirildi" ifadesini görüntüler


3
Bu doğru. Ancak bu özel soru, çakışan dosyaların düz bir listesiyle ilgiliydi. Bu bir XY sorunu olabilir (neden bu çakışma listesine gerçekten ihtiyacım olduğunu hatırlayamıyorum, ancak buna ihtiyaç duymadığım gerçeği, o zaman farklı bir yaklaşım izledim.Şimdi emin değilim ... Ayrıca, bu listeye ihtiyaç duyan java-ithalat çatışmalarını otomatik olarak çözmek için komut dosyaları yazıyordum, yani interaktif olmayan kullanım) ..
inger

Ah, bunu anlamamıştım. "Normal" kullanım için "normal" bir liste istediğinizi düşündüm. Bu yüzden kendi kodunuzu ve kendi cevabınızı çıldırdım ... o zaman "her iki değiştirilmiş" şeyin benim için çalıştığını fark ettim (ve benimle aynı şeyi istediğini varsaydım, neden yapmıyorsun?; - P) Olsa da oy için teşekkürler :)
Rafa

17
git status --short | grep "^UU "

4
Not: ^ UA ve ^ UD için de arama yapmanız gerekebilir, bu nedenle aşağıdaki desen daha eksiksizdir: "^ U [UAD]"
mda

ya da sadece ^UU ile başlayan her şeyi almak için
Ascherer

7
Bu yeterli değil. Çakışan dosyalar aşağıdaki kombinasyonlara sahip olabilir:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: Senaryoları açıklayabilir misiniz? Davam için neyin işe yaradığını yayınladım.
mda

@mda Bir örnek: Akış yukarı değiştirildiğinde, sildiğim çakışma durumu olacakDU
Anthony Sottile

13

Bu benim için çalışıyor:

git grep '<<<<<<< HEAD'

veya

git grep '<<<<<<< HEAD' | less -N


2
Çakışmalar, bu çözümün kapsamayacağı değiştirilmiş veya silinmiş dosyaları içerebilir.
MAR


3

Taahhüt etmeye çalışırsanız ve çakışmalar varsa, git size şu anda çözülmemiş çatışmaların listesini verecektir ... ancak düz bir liste olarak değil. Bu, etkileşimli olarak çalışırken genellikle istediğiniz şeydir, çünkü çakışmaları giderirken liste kısalır.


2
"etkileşimli olarak çünkü anlaşmazlıkları çözdükçe liste kısalıyor." İlginç. Bu amaçla hep birleştirme aleti kullandım.
inger

3

Belki Git'e eklenmiştir, ancak henüz çözülmemiş dosyalar durum mesajında ​​(git durumu) şu şekilde listelenir:

#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      syssw/target/libs/makefile
#

Bunun Birleştirilmemiş yollar bölümü olduğunu unutmayın.


1

$ {GIT_ROOT} adlı git kök dizininizin nerede olduğunu bildiğinizi varsayarsak,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'

0

Her zaman kullandım git status.

awksadece dosya adlarını almak için sonuna ekleyebilirsiniz

git status -s | grep ^U | awk '{print $2}'


0

Buradaki 2 sentim (çok fazla havalı / çalışma yanıtı olsa bile)

Bu takma adı .gitconfig

[alias]
 ...
 conflicts = !git diff --name-only --diff-filter=U | grep -oE '[^/ ]+$'

Bu da bana sadece çatışmalı dosyaların isimlerini gösterecek ... bütün yollarını değil


0

İşte bash komut satırı değiştirme için uygun bir değiştirilmiş dosyaları listesi için kullandığım

git diff --numstat -b -w | grep ^[1-9] | cut -f 3

Listeyi düzenlemek için $(cmd)ikame kullanın .

vi $(git diff --numstat -b -w | grep ^[1-9] | cut -f 3)

Dosya adlarında boşluk varsa çalışmaz. sedBoşluklardan kaçmak veya alıntı yapmak için kullanmaya çalıştım ve çıktı listesi doğru görünüyordu, ancak $()yerine koyma yine de istendiği gibi davranmadı.


0

Yardımcı program git sihirbazı https://github.com/makelinux/git-wizard çözülmemiş çakışan değişiklikleri (çarpışmalar) ve birleştirilmemiş dosyaları ayrı ayrı sayar. Çatışmalar manuel olarak veya birleştirme aracıyla çözülmelidir. Çözümlenmemiş birleştirilmemiş değişiklikler genellikle git rebase ile devam edebilir ve işleyebilirim.


-1

Charles Bailey'nin daha fazla bilgi veren cevabının hafif bir varyasyonu:

git diff --name-only --diff-filter=U | xargs git status

-2

Diğer yanıtlarda vurgulandığı gibi, komut git durumunu kullanabilir ve ardından Birleştirilmemiş yollar altında listelenen dosyaları arayabiliriz:

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.