Was ist der einfachste Weg, um widersprüchliche Dateien in Git aufzulisten?


693

Ich brauche nur eine einfache Liste von Dateien mit Konflikten .

Gibt es etwas Einfacheres als:

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

oder:

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

Ich denke, ich könnte ein Handy aliasdafür einrichten , habe mich aber gefragt, wie Profis das machen. Ich würde es verwenden, um Shell-Schleifen zu schreiben, z. B. um Konflikte automatisch zu lösen usw. Vielleicht diese Schleife durch Einstecken ersetzen mergetool.cmd?


2
git rebase --continuelistet Dateien mit Konflikten auf (falls vorhanden)
jacob

Git Status ist genug
Amruth A

1
In der Konfliktzusammenführungssitzung zeigt "git merge --continue" die Listendateien mit Konflikten an.
Jayan

git rebase --continueIch habe die Konflikte nicht aufgelistet, sondern nur gesagt, ich soll sie beheben (Git-Version 2.21.0)
Gary

Antworten:


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

131
Ich habe einen Alias ​​dafür erstellt:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@ CharlesBailey, vermisse ich etwas? Was ist los mit git status?
Pacerier

8
@ Pacerier, es ist nur chaotischer. Wenn Sie eine Million widersprüchliche Zusammenführungen und eine widersprüchliche Zusammenführung hätten, würden Sie etwas Prägnantes für die Ausgabe wünschen.
Xster

8
@sAguinaga: Einfach laufengit conflicts
Jimothy

1
Dadurch wird die Datei auch nach der Lösung des Konflikts weiterhin angezeigt. git diff --checkfunktioniert besser.
user3812377

64

git diff --check

zeigt die Liste der Dateien mit Konfliktmarkierungen einschließlich Zeilennummern an .

Zum Beispiel:

> 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

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


1
Ich habe festgestellt , git diff --checkerzählte mir von anderen (weniger ernst) Probleme zu, wie nachfolgende Leerzeichen, so dass ein , git diff --check | grep -i conflictum für OP Fall sein könnte
CCJ

37

Ich versuche meine Frage zu beantworten:

Nein, es scheint keinen einfacheren Weg als den fraglichen zu geben.

Nachdem ich das zu oft eingegeben habe, habe ich einfach die kürzere in eine ausführbare Datei mit dem Namen 'git-Konflikt' eingefügt, die git zugänglich gemacht wurde. Jetzt kann ich nur noch: git conflictsdie gewünschte Liste erhalten.

Update: Wie Richard vorschlägt, können Sie alternativ zur ausführbaren Datei einen Git-Alias ​​einrichten

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

Ein Vorteil der Verwendung der ausführbaren Datei gegenüber dem Alias ​​besteht darin, dass Sie dieses Skript für Teammitglieder freigeben können (in einem bin dir-Teil des Repos).


1
Zu diesem Zeitpunkt ging es mir genauso - ich dachte darüber nach, wie zum Teufel die Leute das nicht brauchen, und sah, wie trivial es war, das Problem zu umgehen. Allerdings benutze ich Git jetzt seit 2 Jahren und bin ehrlich gesagt nicht mehr auf diese "Einschränkung" gestoßen. Vielleicht ist das doch nicht so üblich?
Inger

4
Dies ist so einfach, dass Sie einen Alias ​​dafür einrichten können git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(bedeutet! Diesen Shell-Befehl ausführen und nicht nur einen Git-Befehl).
Richard

1
Erwähnenswert ist, dass Sie tatsächlich "einfache Anführungszeichen" anstelle von "doppelten Anführungszeichen" möchten. Andernfalls !wird das von Ihrer Shell interpretiert:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop

26

Hier ist ein narrensicherer Weg:

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

9
Nein. Der Git-Index markiert bestimmte Dateien auch dann intern als in Konflikt stehend, selbst nachdem die Textmarkierungen in den Dateien entfernt wurden.
Alexander Bird

7
Neben Alexanders Kommentar ist es immer noch nützlich, dies als Option zu sehen :) Bitte nicht löschen.
WoodenKitty

3
Oder um innerhalb des aktuellen Arbeitsverzeichnisses zu laufen, verwenden Sie einen Punkt für Pfad -grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, das ist auch meine Art, es zu tun. Wenn Sie ein cgutes Ergebnis hinzufügen, zählt auch die Anzahl der Konflikte! Eine Anmerkung ist, dass ich Flags verwenden würde, -Hrndie auch Zeilennummerninformationen liefern.
ShellFish

3
Wenn Sie Regex verwenden, würde ich [<=>]{7}stattdessen vorschlagen . (Möglicherweise ist ein -EFlag erforderlich , damit dies in grep funktioniert.) Oder <{7}wenn Sie sich keine Sorgen über baumelnde Zusammenführungsmarkierungen machen oder die Konflikte zählen möchten. (Sie können auch verwenden git grep- dann brauchen Sie die -rFlagge nicht.)
Celticminstrel

22

git status zeigt "beide geändert" neben Dateien mit Konflikten anstelle von "geändert" oder "neue Datei" usw. an


3
Das stimmt. Bei dieser speziellen Frage ging es jedoch um eine einfache Liste von Dateien mit Konflikten. Dies könnte ein XY-Problem sein (ich kann mich nicht erinnern, warum ich diese Konfliktliste tatsächlich benötigt habe, aber die Tatsache, dass ich sie seitdem nicht mehr benötigt habe, könnte darauf hindeuten, dass ich es tun sollte Ich habe damals einen anderen Ansatz verfolgt. Ich bin mir jetzt nicht sicher. Ich habe auch Skripte für die automatische Lösung von Java-Import-Konflikten geschrieben, die diese Liste benötigten, dh nicht interaktive Verwendung.
Inger

Oh, das hatte ich nicht verstanden. Ich dachte, Sie wollten eine "normale" Liste für den "normalen" Gebrauch. Aus diesem Grund bin ich mit deinem eigenen Code und deiner Selbstantwort ausgeflippt ... dann wurde mir klar, dass das "beide modifizierte" Ding für mich funktioniert (und ich nahm an, dass du nur das Gleiche wie ich wolltest, warum solltest du nicht?; - P) Danke für die positive Abstimmung :)
Rafa

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

4
Hinweis: Möglicherweise müssen Sie auch nach ^ UA und ^ UD suchen, damit das folgende Muster vollständiger ist: "^ U [UAD]"
mda

oder einfach ^Uum alles mit U
Ascherer am

7
Das reicht nicht aus. In Konflikt stehende Dateien können die folgenden Kombinationen haben:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: Können Sie die Szenarien erklären? Ich habe gepostet, was für meinen Fall funktioniert hat.
MDA

@mda Ein Beispiel: Konflikt, wo Upstream geändert, ich gelöscht habe, wird Status habenDU
Anthony Sottile

13

Das funktioniert bei mir:

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

oder

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


2
Konflikte können geänderte oder gelöschte Dateien enthalten, die von dieser Lösung nicht abgedeckt werden.
Mär

11

Sie können schlagen git ls-files -u auf Ihre Befehlszeile klicken, um Dateien mit Konflikten aufzulisten


3

Wenn Sie versuchen, einen Commit durchzuführen, und wenn es Konflikte gibt, gibt Ihnen git die Liste der derzeit ungelösten Konflikte ... aber nicht als einfache Liste. Dies ist normalerweise das, was Sie möchten, wenn Sie interaktiv arbeiten, da die Liste kürzer wird, wenn Sie die Konflikte beheben.


2
"Interaktiv, weil die Liste kürzer wird, wenn Sie die Konflikte beheben." Interessant. Ich habe immer Mergetool für diesen Zweck verwendet.
Inger

3

Möglicherweise wurde dies zu Git hinzugefügt, aber die Dateien, die noch aufgelöst werden müssen, werden in der Statusmeldung (Git-Status) wie folgt aufgelistet:

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

Beachten Sie, dass dies der Abschnitt Nicht zusammengeführte Pfade ist.


1

Angenommen, Sie wissen, wo sich Ihr Git-Stammverzeichnis $ {GIT_ROOT} befindet, können Sie Folgendes tun:

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

0

Ich habe immer nur verwendet git status.

kann awkam Ende hinzufügen , um nur die Dateinamen zu erhalten

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


0

Meine 2 Cent hier (auch wenn es viele coole / funktionierende Antworten gibt)

Ich habe diesen Alias ​​in meinem erstellt .gitconfig

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

Das wird mir nur die Namen der Dateien mit Konflikten zeigen ... nicht ihren ganzen Pfad :)


0

Folgendes verwende ich, um geänderte Dateien aufzulisten, die für die Befehlszeilensubstitution in Bash geeignet sind

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

Verwenden Sie zum Bearbeiten der Liste die $(cmd)Substitution.

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

Funktioniert nicht, wenn die Dateinamen Leerzeichen enthalten. Ich habe versucht, seddie Leerzeichen zu maskieren oder zu zitieren, und die Ausgabeliste sah richtig aus, aber die $()Ersetzung hat sich immer noch nicht wie gewünscht verhalten.


0

Der Dienstprogramm-Git-Assistent https://github.com/makelinux/git-wizard zählt ungelöste Konfliktänderungen (Kollisionen) und nicht zusammengeführte Dateien separat. Konflikte müssen manuell oder mit mergetool gelöst werden. Gelöste nicht zusammengeführte Änderungen können in der Regel mit git rebase --continue hinzugefügt und festgeschrieben werden.


-1

geringfügige Abweichung von Charles Baileys Antwort, die weitere Informationen enthält:

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

-2

Wie in anderen Antworten hervorgehoben, können wir einfach den Befehl git status verwenden und dann nach Dateien suchen, die unter Nicht zusammengeführte Pfade aufgeführt sind:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.