it-swarm.com.de

Wie kann ich entfernte Änderungen verwerfen und eine Datei als "gelöst" markieren?

Ich habe einige lokale Dateien, ich ziehe aus dem Remote-Zweig und es gibt Konflikte. Ich weiß, dass ich meine lokalen Änderungen beibehalten und die Remote-Änderungen, die Konflikte verursachen, ignorieren möchte. Gibt es einen Befehl, mit dem ich sagen kann: "Alle Konflikte als gelöst markieren, lokal verwenden"?

194
Tom DeMille

git checkout hat die Option --ours, Um die Version der Datei auszuchecken, die Sie lokal hatten (im Gegensatz zu --theirs, Der Version, die diese Version hat) du hast eingezogen). Sie können . An git checkout Übergeben, um es anzuweisen, alles im Baum zu überprüfen. Dann müssen Sie die Konflikte als gelöst markieren, was Sie mit git add tun können, und Ihre Arbeit einmal ausführen:

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 den . Im Befehl git checkout. Das ist sehr wichtig und leicht zu übersehen. git checkout Hat zwei Modi; Eine, in der die Verzweigungen 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). Die Unterscheidung besteht darin, ob Sie einen Dateinamen übergeben haben. Wenn Sie keinen Dateinamen übergeben haben, wird versucht, den Zweig 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 . Oder einen Dateinamen übergeben, um das zweite Verhalten von git checkout Zu erhalten.

Es ist auch eine gute Angewohnheit, bei der Übergabe eines Dateinamens diesen mit -- Wie git checkout --ours -- <filename> Zu versetzen. Wenn Sie dies nicht tun und der Dateiname zufällig mit dem Namen einer Verzweigung oder eines Tags übereinstimmt, denkt Git, dass Sie diese Revision auschecken möchten, anstatt diesen Dateinamen auszchecken, und verwendet daher die erste Form von checkout Befehl.

Ich werde etwas näher darauf eingehen, wie Konflikte und Zusammenführen in Git funktionieren. Wenn Sie den Code einer anderen Person zusammenführen (was auch während eines Pulls passiert; ein Pull ist im Wesentlichen ein Abruf gefolgt von einem Merge), 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 nur ein Nachkomme von Ihnen ist. In diesem Fall haben Sie standardmäßig eine "Schnellvorlauf-Zusammenführung", bei der Ihr HEAD nur auf ihren Festschreibungswert aktualisiert wird, ohne dass eine Zusammenführung stattfindet (dies kann deaktiviert werden, wenn Sie möchten wirklich eine Zusammenführung mit --no-ff) aufzeichnen.

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 davon ist, dass die Zusammenführung reibungslos vonstatten geht. 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. Standardmäßig wird eine bereinigte Zusammenführung automatisch festgeschrieben. Sie können dies jedoch mit --no-commit Deaktivieren, wenn Sie sie zuvor bearbeiten müssen (z. B. wenn Sie die Funktion foo in bar umbenennen und eine andere Person neue hinzufügt) Code, der foo aufruft, wird sauber zusammengeführt, es wird jedoch ein fehlerhafter Baum erstellt. Sie können ihn daher im Rahmen des Zusammenführungs-Commits bereinigen, um fehlerhafte Commits zu vermeiden.

Die letzte Möglichkeit ist, dass es eine echte Verschmelzung gibt und es Konflikte gibt. In diesem Fall übernimmt Git so viel wie möglich die Zusammenführung und erstellt Dateien mit Konfliktmarkierungen (<<<<<<<, ======= Und >>>>>>>) In Ihrer Arbeitskopie. Im Index (auch als "Staging-Bereich" bezeichnet; der Ort, an dem Dateien vor dem Festschreiben mit git add Gespeichert werden) befinden sich 3 Versionen jeder Datei mit Konflikten. Es gibt die Originalversion der Datei von dem Vorfahren der beiden Zweige, die Sie zusammenführen, die Version von HEAD (Ihre Seite der Zusammenführung) und die Version von dem fernen 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. Sie können die Version auch mit git checkout --ours Oder git checkout --theirs Von der einen oder anderen Seite der Zusammenführung auschecken. 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 mit git add Festgeschrieben werden kann. Anschließend können Sie die Zusammenführung mit git commit Festschreiben. .

320
Brian Campbell

Stellen Sie den Konflikt sicher. Ursprung: Wenn er das Ergebnis eines git merge Ist, lesen Sie Brian Campbell 's answer .

Aber wenn das Ergebnis eines git rebase Ist, müssen Sie, um remote (ihre) Änderungen zu verwerfen und local Änderungen verwenden mache ein:

git checkout --theirs -- .

Siehe " Warum ist die Bedeutung von" ours "und" theirs "umgekehrt" ", um zu sehen, wie ours und theirs werden während eines Rebases getauscht (weil der Zweig upstream ausgecheckt ist).

22
VonC