ABDiff-Hilfe

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:

  1. Öffnen Sie die Datei in einem Editor und entfernen Sie die Konfliktmarker.
  2. Stufieren Sie die aufgelöste Datei mit git add.

Um den Konflikt in einem externen Tool zu beheben führen Sie Folgendes aus:

git mergetool

git 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:

  1. merge.tool Konfiguration.
  2. $GIT_MERGE_TOOL Umgebungsvariable.
  3. 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.swift

Das 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:

  1. diff.tool Konfiguration.
  2. $GIT_DIFF_TOOL Umgebungsvariable.
  3. Automatische Erkennung von bekannten Werkzeugen in $PATH.
  4. Fallback zu vimdiff.