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?
git diff --name-only --diff-filter=U
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).
Hier ist ein narrensicherer Weg:
grep -H -r "<<<<<<< HEAD" /path/to/project/dir
git status
zeigt "beide geändert" neben Dateien an, die Konflikte aufweisen, statt "modifizierte" oder "neue Datei" usw
git status --short | grep "^UU "
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
Das funktioniert für mich:
git grep '<<<<<<< HEAD'
oder
git grep '<<<<<<< HEAD' | less -N
sie können git ls-files -u
in Ihrer Befehlszeile drücken, um Dateien mit Konflikten anzuzeigen
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.
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.
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}'
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.
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 :)
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: