wake-up-neo.com

Was ist der einfachste Weg, um eine Liste der in Konflikt stehenden Dateien zu erhalten?

Ich brauche nur eine einfache Liste der in Konflikt stehenden Dateien.

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 schätze, ich könnte einen praktischen Alias ​​dafür einrichten, fragte mich jedoch, wie Profis es tun. Ich würde es verwenden, um Shell-Schleifen zu schreiben, z. zum automatischen Auflösen von Konflikten usw. Ersetzen Sie diese Schleife möglicherweise durch Einfügen in mergetool.cmd?

559
inger
git diff --name-only --diff-filter=U
981
CB Bailey

Ich versuche meine Frage zu beantworten:

Nein, es scheint keinen einfacheren Weg zu geben als den in der Frage vorkommenden.

Nachdem ich das zu oft eingegeben hatte, fügte es einfach die kürzere in eine ausführbare Datei namens 'git-conflict' ein, die für git zugänglich gemacht wurde. Jetzt kann ich einfach: git conflicts die gewünschte Liste erhalten.

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

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

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

34
inger

Hier ist ein narrensicherer Weg: 

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

git status zeigt "beide geändert" neben Dateien an, die Konflikte aufweisen, statt "modifizierte" oder "neue Datei" usw

17
Rafa
git status --short | grep "^UU "
16
mda

git diff --check 

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

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

15
cnlevy

Das funktioniert für mich:

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

oder

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

12
Eric Wang

sie können git ls-files -u in Ihrer Befehlszeile drücken, um Dateien mit Konflikten anzuzeigen

10

Vielleicht wurde dies zu Git hinzugefügt, aber die Dateien, die noch aufgelöst werden müssen, werden in der Statusmeldung (git status) wie folgt aufgeführt:

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

Beachten Sie, dass dies der Abschnitt Unmerged pathes ist.

3
Patrick O'Hara

Wenn Sie versuchen, einen Commit auszuführen, und wenn Konflikte vorliegen, erhalten Sie von git eine Liste der aktuell nicht aufgelösten Konflikte ... aber nicht als einfache Liste. Dies ist normalerweise das, was Sie beim interaktiven Arbeiten wünschen, da die Liste mit der Behebung der Konflikte kürzer wird.

2
Tel

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

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

Ich habe immer nur git status verwendet.

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

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

0
Ascherer

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 Ersetzung $(cmd).

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

Funktioniert nicht, wenn die Dateinamen Leerzeichen enthalten. Ich habe versucht, sed zu verwenden, um die Leerzeichen zu maskieren oder in Anführungszeichen zu setzen, und die Ausgabeliste sah richtig aus, aber die Ersetzung durch $() verhielt sich immer noch nicht wie gewünscht.

0
Darrel Lee

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

Ich habe diesen Alias ​​in meinem .gitconfig erstellt.

[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
Manu

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

0
sandesh