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?


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

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


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).


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

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


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 "

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


2
Konflikty mogą obejmować zmodyfikowane kontra usunięte pliki, których to rozwiązanie nie obejmie.
Mär


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.


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.


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'

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}'


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ę :)


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.


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.


-1

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

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

-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:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.