git checkout
hat die --ours
Option, die Version der Datei auszuchecken, die Sie lokal hatten (im Gegensatz zu --theirs
der Version, die Sie eingezogen haben). Sie können .
an übergeben git checkout
, um es anzuweisen, alles im Baum zu überprüfen. Dann müssen Sie die Konflikte als gelöst markieren, mit denen Sie git add
fertig werden können , und Ihre Arbeit nach Abschluss erledigen:
git checkout --ours . # checkout our local version of all files
git add -u # mark all conflicted files as merged
git commit # commit the merge
Beachten Sie die .
im git checkout
Befehl. Das ist sehr wichtig und leicht zu übersehen. git checkout
hat zwei Modi; eine, in der Zweige gewechselt werden, und eine, in der Dateien aus dem Index in die Arbeitskopie eingecheckt werden (manchmal werden sie zuerst aus einer anderen Revision in den Index gezogen). Es unterscheidet sich dadurch, ob Sie einen Dateinamen übergeben haben. Wenn Sie keinen Dateinamen übergeben haben, wird versucht, die Zweige zu wechseln (wenn Sie jedoch auch keinen Zweig übergeben, wird nur versucht, den aktuellen Zweig erneut auszuchecken), dies wird jedoch abgelehnt, wenn geänderte Dateien vorhanden sind dass das bewirken würde. Wenn Sie also ein Verhalten wünschen, das vorhandene Dateien überschreibt, müssen Sie .
einen Dateinamen übergeben, um das zweite Verhalten zu erhalten git checkout
.
Es ist auch eine gute Angewohnheit, bei der Übergabe eines Dateinamens diesen auszugleichen --
, z git checkout --ours -- <filename>
. Wenn Sie dies nicht tun und der Dateiname zufällig mit dem Namen eines Zweigs oder Tags übereinstimmt, wird Git denken, dass Sie diese Revision auschecken möchten, anstatt diesen Dateinamen auszuchecken, und daher die erste Form des checkout
Befehls verwenden .
Ich werde etwas näher darauf eingehen, wie Konflikte und Zusammenführungen in Git funktionieren. Wenn Sie den Code einer anderen Person zusammenführen (was auch während eines Pulls geschieht; ein Pull ist im Wesentlichen ein Abruf, gefolgt von einem Zusammenführen), gibt es nur wenige mögliche Situationen.
Das einfachste ist, dass Sie sich in derselben Revision befinden. In diesem Fall sind Sie "bereits auf dem neuesten Stand" und es passiert nichts.
Eine andere Möglichkeit besteht darin, dass ihre Revision einfach ein Nachkomme von Ihnen ist. In diesem Fall haben Sie standardmäßig eine "Schnellvorlauf-Zusammenführung", bei der Ihre HEAD
Version nur auf ihre Festschreibung aktualisiert wird, ohne dass eine Zusammenführung stattfindet (dies kann deaktiviert werden, wenn Sie dies tun) möchte wirklich eine Zusammenführung aufzeichnen, mit --no-ff
).
Dann kommen Sie in die Situationen, in denen Sie tatsächlich zwei Revisionen zusammenführen müssen. In diesem Fall gibt es zwei mögliche Ergebnisse. Eine ist, dass die Zusammenführung sauber erfolgt; Alle Änderungen befinden sich in verschiedenen Dateien oder in denselben Dateien, sind jedoch so weit voneinander entfernt, dass beide Änderungssätze problemlos angewendet werden können. Wenn eine saubere Zusammenführung stattfindet, wird diese automatisch festgeschrieben. Sie können dies jedoch deaktivieren, --no-commit
wenn Sie sie zuvor bearbeiten müssen (wenn Sie beispielsweise die Funktion foo
in umbenennen bar
und jemand anderes neuen Code hinzufügt, der aufruft foo
, wird sie sauber zusammengeführt Wenn Sie jedoch einen fehlerhaften Baum erstellen, sollten Sie diesen im Rahmen des Zusammenführungs-Commits bereinigen, um zu vermeiden, dass defekte Commits ausgeführt werden.
Die letzte Möglichkeit ist, dass es eine echte Verschmelzung gibt und es Konflikte gibt. In diesem Fall wird tun Git so viel von der Zusammenführung , wie sie können, und produzieren Dateien mit Konfliktmarken ( <<<<<<<
, =======
, und >>>>>>>
) in Ihrer Arbeitskopie. Im Index (auch als "Staging-Bereich" bezeichnet; der Ort, an dem Dateien gespeichert werden, git add
bevor sie festgeschrieben werden) befinden sich 3 Versionen jeder Datei mit Konflikten. Es gibt die Originalversion der Datei vom Vorfahren der beiden Zweige, die Sie zusammenführen, die Version von HEAD
(Ihre Seite der Zusammenführung) und die Version vom Remote-Zweig.
Um den Konflikt zu lösen, können Sie entweder die Datei in Ihrer Arbeitskopie bearbeiten, die Konfliktmarkierungen entfernen und den Code so korrigieren, dass er funktioniert. Oder können Sie die Version von einem oder den anderen Seiten der Zusammenführung überprüfen, mit git checkout --ours
oder git checkout --theirs
. Sobald Sie die Datei in den gewünschten Zustand versetzt haben, geben Sie an, dass Sie mit dem Zusammenführen der Datei fertig sind und sie zum Festschreiben bereit ist. git add
Anschließend können Sie die Zusammenführung mit festschreiben git commit
.