Aktualisiert Antwort: Meine ursprüngliche Version des Skripts unten wurde im Sinne fehlerhaft, dass $conflicting_files
in der Tat nicht nur die Dateien enthalten haben, die wirklich Konflikte hatte, aber alle Dateien, die geändert wurden in beiden Elternteilen (hatte aber nicht unbedingt Konflikte). Außerdem verwendete es nicht das "konfigurierte Zusammenführungswerkzeug", wie in der Begründung angegeben, sondern diffuse
. Ich habe beide Probleme in der current version of the script angesprochen.
Ursprüngliche Antwort: Angenommen, wir haben einen „Master“ Zweig mit die wichtigste Entwicklung im Gange, und ein „Thema“ Zweig, der an der Spitze von einigen (älteren) Zustand der Master eine Funktion hinzufügt.Wenn Sie sagen, dass Sie nur nach den Dateien suchen, die im Merge-Commit geändert wurden, nehme ich an, dass Sie nur an den Änderungen interessiert sind, die in "Master" im Zusammenführungs-Commit (einschließlich einer Konfliktlösung) eingeführt wurden. widersprüchliche Änderungen, die in "Master" vorgenommen wurden, da "Thema" verzweigt war. Die Weitere davon aus, dass „Master“ ist die erste Mutter Ihrer merge begehen und „Thema“ ist die zweite, kann dies mit
git difftool <merge commit>^1 <merge commit>
Hinweis erreicht wird, dass es nicht sinnvoll, einen 3-Wege-diff hier zu verwenden, macht als Wir betrachten den Zustand, der enthält keine Konfliktlösung. Dies zeigt auch, was GitHub für Merge-Commits zeigt, siehe z. this merge commit die ich zum Testen benutzt habe.
Um nur die widerstreitenden Dateien und die Lösungen in einem 3-Wege-diff Werkzeug, das ich mit diesem Skript
#!/bin/sh
if [ $# -ne 1 ]; then
echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool."
echo "Usage : $(basename $0) <merge commit>"
exit -1
fi
# Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8
our=$1^1
their=$1^2
base=$(git merge-base $our $their)
conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^\s]+$")
for f in $conflicting_files; do
diffuse -r $our -r $base -r $their $f
done
kam zu sehen, ich bin Diffuse statt Beyond Compare verwenden, da die ersten direkt arbeiten kann auf Git verpflichtet im Gegensatz zu lokalen Dateien; Ändern Sie die Reihenfolge der Argumente nach Ihren Wünschen. Um BC zu verwenden, müssen Sie wahrscheinlich temporäre Auscheckvorgänge durchführen. Ich habe auch darüber nachgedacht, die Zusammenführung zu wiederholen, die bekannte Auflösung anzuwenden und auszuführen, was auch immer git mergetool
konfiguriert ist, aber beide dieser Ideen würden mehr Arbeit erfordern, um Ihren Arbeitsbaum nicht zu verwirren und die Aufräumarbeiten richtig zu machen.
+1 für diffuse, könnte es sogar eine 4-Wege-Diff mit verschiedenen Commits tun – Johan