Jaki jest najprostszy sposób wyświetlania listy konfliktowanych plików w Git?

692

Potrzebuję tylko prostej listy konfliktów plików.

Czy jest coś prostszego niż:

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

lub:

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

Wydaje mi się, że mógłbym to zrobić alias, ale zastanawiałem się, jak to robią profesjonaliści. Używałbym jej do zapisywania pętli powłoki, np. Do automatycznego rozwiązywania konfliktów itp. Może zamień tę pętlę, podłączając się do niej mergetool.cmd?

Inger
źródło
2
git rebase --continuewyświetli listę plików z konfliktami (jeśli występują)
jacob
wystarczy status git
Amruth A
1
W sesji konfliktu scalenia `git merge --continue` wyświetli listę plików z konfliktami.
Jayan
git rebase --continuenie wymienił konfliktów, po prostu kazał mi je naprawić (git wersja 2.21.0)
Gary

Odpowiedzi:

1211
git diff --name-only --diff-filter=U
CB Bailey
źródło
131
Stworzyłem dla tego alias:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy
1
@CharlesBailey, czy coś mi brakuje? Co jest nie tak z git status?
Pacerier,
8
@Pacerier, to po prostu bałagan. Jeśli miałeś milion nieporozumiennych połączeń i jedno konfliktowe scalenie, chciałbyś mieć coś zwięzłego dla wyników.
xster
8
@sAguinaga: Po prostu uruchomgit conflicts
Jimothy,
1
Nadal wyświetla plik, nawet po rozwiązaniu konfliktu. git diff --checkdziała lepiej.
user3812377,
64

git diff --check

pokaże listę plików zawierających znaczniki konfliktu, w tym numery linii .

Na przykład:

> 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

źródło: https://ardalis.com/detect-git-conflict-markers

cnlevy
źródło
1
Odkryłem, że git diff --checkopowiadam też o innych (mniej poważnych) problemach, takich jak końcowe białe znaki, więc git diff --check | grep -i conflictmoże być w przypadku OP
CCJ
37

Próbuję odpowiedzieć na moje pytanie:

Nie, nie wydaje się, że istnieje prostszy sposób niż ten w pytaniu, po wyjęciu z pudełka.

Po zbyt częstym wpisywaniu tego, wkleiłem krótszy plik do pliku wykonywalnego o nazwie „git-konflikty”, udostępnionego dla git, teraz mogę po prostu: git conflictsuzyskać żądaną listę.

Aktualizacja: jak sugeruje Richard, możesz ustawić alias git jako alternatywę dla pliku wykonywalnego

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

Zaletą korzystania z pliku wykonywalnego nad aliasem jest to, że można udostępnić ten skrypt członkom zespołu (w części repo bin bin).

Inger
źródło
1
W tym momencie czułem się tak samo - myśląc, że do cholery ludzie tego nie potrzebują, i widząc, jak banalne było obejście tego problemu. Jednak używam gita już od 2 lat i szczerze mówiąc, nie napotkałem ponownie tego „ograniczenia”. Więc może to wcale nie jest tak powszechny przypadek użycia?
inger
4
Jest to na tyle proste, że można ustawić dla niego alias git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(!! Oznacza uruchomienie tego polecenia powłoki, a nie tylko polecenia git).
Richard,
1
Warto wspomnieć, że tak naprawdę chcesz „pojedynczych cudzysłowów” zamiast „podwójnych cudzysłowów”. W przeciwnym razie !zostanie zinterpretowana przez twoją powłokę:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop
26

Oto niezawodny sposób:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir
Jones Agyemang
źródło
9
Nie. Indeks Gita nadal wewnętrznie oznaczy niektóre pliki jako będące w konflikcie, nawet po usunięciu znaczników tekstowych w plikach.
Alexander Bird
7
Oprócz komentarza Aleksandra nadal warto widzieć to jako opcję :) Nie usuwaj.
WoodenKitty
3
Lub biegnij w bieżącym reżimie pracy, użyj kropki na ścieżce -grep -H -r "<<<<<<< HEAD" .
David Douglas
Hehe, to też mój sposób, żeby to zrobić. Dodanie cładnie Wynika liczbę konfliktów też! Jedna uwaga jest taka, że ​​użyłbym flag, -Hrnktóre dostarczą również informacji o numerze linii.
ShellFish,
3
Jeśli używasz wyrażenia regularnego, sugerowałbym [<=>]{7}zamiast tego. (Może potrzebować -Eflagi, aby działała w grep.) Lub, <{7}jeśli nie martwisz się o wiszące znaczniki scalania lub chcesz policzyć konflikty. (Możesz także użyć git grep- wtedy nie potrzebujesz -rflagi.)
celticminstrel
22

git status wyświetla „oba zmodyfikowane” obok plików powodujących konflikty zamiast „zmodyfikowanych” lub „nowych plików” itp

Rafa
źródło
3
To prawda. Jednak to konkretne pytanie dotyczyło zwykłej listy plików będących w konflikcie. Może to być problem XY (nie pamiętam, dlaczego tak naprawdę potrzebowałem tej listy konfliktów, ale fakt, że nie potrzebowałem jej, może sugerować, że powinienem podążały inne podejście wtedy na pewno nie teraz .. ja również pisał scenariusze dla autoresolving konfliktów java-import które wymagają tej listy, czyli nie-interaktywne używanie) ....
Inger
Nie zrozumiałem tego. Myślałem, że potrzebujesz „normalnej” listy do „normalnego” użytku. Właśnie dlatego wystraszyłem się twoim własnym kodem i twoją własną odpowiedzią ... wtedy zdałem sobie sprawę, że „obie zmodyfikowane” rzeczy działały dla mnie (i założyłem, że po prostu chciałeś tego samego jak ja, dlaczego nie?) P) Dziękuję za głosowanie :)
Rafa
17
git status --short | grep "^UU "
mda
źródło
4
Uwaga: Może być konieczne wyszukanie ^ UA i ^ UD, więc następujący wzorzec jest bardziej kompletny: „^ U [UAD]”
mda
lub po prostu ^Uwszystko, zaczynając od U
Ascherer
7
To nie wystarcza. Sprzeczne pliki mogą mieć następujące kombinacje:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile
1
@AnthonySottile: Czy potrafisz wyjaśnić scenariusze? Opublikowałem to, co zadziałało w mojej sprawie.
mda
@mda Jeden przykład: konflikt, w którym zmodyfikowano upstream, usunąłem, będzie miał statusDU
Anthony Sottile
13

To działa dla mnie:

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

lub

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

Eric Wang
źródło
2
Konflikty mogą obejmować zmodyfikowane kontra usunięte pliki, których to rozwiązanie nie obejmie.
Mär
11

możesz nacisnąć git ls-files -uw linii poleceń, wyświetla listę plików z konfliktami

Emil Reña Enriquez
źródło
3

Jeśli spróbujesz zatwierdzić, a jeśli wystąpią konflikty, git poda Ci listę aktualnie nierozwiązanych konfliktów ... ale nie jako zwykłą listę. Jest to zwykle to, czego chcesz, gdy pracujesz interaktywnie, ponieważ lista jest krótsza w miarę rozwiązywania konfliktów.

Tel
źródło
2
„interaktywnie, ponieważ lista ulega skróceniu w miarę rozwiązywania konfliktów”. Ciekawy. W tym celu zawsze korzystałem z narzędzia wielofunkcyjnego.
inger
3

Być może zostało to dodane do Git, ale pliki, które wymagają jeszcze rozwiązania, są wymienione w komunikacie o stanie (status git) w następujący sposób:

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

Zauważ, że jest to sekcja Unmerged paths.

Patrick O'Hara
źródło
1

Zakładając, że wiesz, gdzie jest katalog główny git, $ {GIT_ROOT}, możesz to zrobić,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'
Tzunghsing David Wong
źródło
0

Zawsze używałem git status.

można dodać awkna końcu, aby uzyskać tylko nazwy plików

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

Ascherer
źródło
0

Moje 2 centy tutaj (nawet jeśli jest wiele fajnych / działających odpowiedzi)

W tym utworzyłem ten alias .gitconfig

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

który pokaże mi tylko nazwy plików z konfliktami ... nie całą ich ścieżkę :)

Manu
źródło
0

Oto, czego używam do listy zmodyfikowanych plików odpowiednich do podstawienia wiersza poleceń w bash

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

Aby edytować listę, użyj $(cmd)podstawienia.

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

Nie działa, jeśli w nazwach plików są spacje. Próbowałem użyć sedklawisza Escape lub zacytować spacje, a lista wyjściowa wyglądała poprawnie, ale $()podstawienie nadal nie działało zgodnie z oczekiwaniami.

Darrel Lee
źródło
0

Narzędzie kreatora git https://github.com/makelinux/git-wizard zlicza osobno nierozwiązane zmiany w konflikcie (kolizje) i nie scalone pliki. Konflikty muszą być rozwiązywane ręcznie lub za pomocą narzędzia wielofunkcyjnego. Rozwiązane nie scalone zmiany można dodawać i zatwierdzać zwykle za pomocą git rebase - kontynuuj.

Costa
źródło
-1

niewielka zmienność odpowiedzi Charlesa Baileya, która daje więcej informacji:

git diff --name-only --diff-filter=U | xargs git status
taj
źródło
-2

Jak podkreślono w innych odpowiedziach, możemy po prostu użyć polecenia git status, a następnie poszukać plików wymienionych w obszarze Unmerged paths:

sandesh
źródło