Git-Diff- und -Merge-Workflows
Git führt Diffs, Merges und Rebases mit seinen eigenen internen Algorithmen durch. Diese Operationen sind deterministisch und vollständig automatisiert: Git verlässt sich nie auf externe Tools.
Es gibt jedoch Situationen, in denen menschliches Urteilsvermögen erforderlich ist. Zum Beispiel, wenn Änderungen visuell oder semantisch statt textlich bewertet werden müssen. In diesen Fällen kann Git externe Tools aufrufen, um bei der Inspektion zu helfen, nicht bei der Entscheidungsfindung.
Ein gängiges Beispiel unter macOS ist FileMerge.app, das mit den Xcode-Befehlszeilentools installiert ist und von Git als Diff- oder Merge-Helfer gestartet werden kann.
Merge
Wenn Git Zweige zusammenführt und keine Änderungen abgleichen kann, schreibt es Konfliktmarkierungen in jede widersprüchliche Datei, stoppt dann die Zusammenführung und benachrichtigt den Benutzer. Für jede Datei mit Konfliktmarkierungen werden drei Stufen im Git-Index aufgezeichnet: common ours und theirs. Zu diesem Zeitpunkt befindet sich das Repository in einem konfliktreichen Zusammenführungszustand und Git wartet darauf, dass alle Konflikte gelöst sind.
Bei einer widersprüchlichen Datei File.swift werden die
generierten Dateien
Um den Konflikt manuell zu beheben, bearbeiten Sie die Datei:
- Öffnen Sie die Datei in einem Editor und entfernen Sie die Konfliktmarker.
- Stufieren Sie die aufgelöste Datei mit
git add.
Um den Konflikt in einem externen Tool zu beheben führen Sie Folgendes aus:
git mergetoolgit mergetool startet das Tool einmal für jede
widersprüchliche Datei, übergibt die BASE, ours, theirs und mergel
result paths an das Tool. Git wartet, bis das Tool beendet ist, bevor es
die nächste Datei startet. Der Exit-Code der Anwendung für jede Datei
bestimmt, ob die Datei als aufgelöst markiert ist oder nicht. Sie haben
auch die Möglichkeit, git add <file> explizit
auszuführen, um es als inszeniert zu markieren.
Wenn mehrere Merge-Tools konfiguriert sind, wählt Git das erste aus dieser Liste aus:
merge.toolKonfiguration.$GIT_MERGE_TOOLUmgebungsvariable.- Automatische Erkennung von bekannten installierten Werkzeugen.
Externes Tool aufrufen
Für jede widersprüchliche Datei Example.swift erstellt
Git zusätzliche Dateien, die hier zu sehen sind:
Example_BACKUP_70842.swift
Example_BASE_70842.swift
Example_LOCAL_70842.swift
Example_REMOTE_70842.swift
Example.swift
Die Suffixnummer ändert sich bei jedem Aufruf. Dann ruft es das Tool
mit einem konfigurierten Befehl auf, wie wir es in Git-Integration gesehen haben. Für
abd lautet der Befehl
abd --base Example_BASE_70842.swift --local Example_LOCAL_70842.swift --remote Example_REMOTE_70842.swift --result Example.swiftDas Werkzeug soll die Konfliktmarkierungen entfernen und normal aussteigen. Dies deutet darauf hin, dass der Konflikt gelöst wurde.
Diff
Für Diffing sind externe Werkzeuge nur für die Sichtprüfung nützlich.
Git ignoriert den Rückgabecode, wenn die Anwendung beendet wird. Wenn
Sie git difftool aufrufen, zählt Git die geänderten Dateien
auf und startet das externe Tool für jedes Dateipaar.
Normalerweise ist es besser, die Dateien, die Sie vergleichen
möchten, einfach per Drag & Drop zu ziehen. Aber wenn Sie lieber
alle vergleichen möchten, führen Sie git difftool aus. Das
aufgerufene externe Werkzeug ist das erste, das aus dieser Liste
gefunden wurde:
diff.toolKonfiguration.$GIT_DIFF_TOOLUmgebungsvariable.- Automatische Erkennung von bekannten Werkzeugen in
$PATH. - Fallback zu
vimdiff.