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 tatsächlich sagen kann: "Alle Konflikte als gelöst markieren, lokal verwenden"?
git
merge
conflict
git-merge-conflict
Tom DeMille
quelle
quelle
Antworten:
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 übergebengit checkout
, um es anzuweisen, alles im Baum zu überprüfen. Dann müssen Sie die Konflikte als gelöst markieren, mit denen Siegit add
fertig werden können , und Ihre Arbeit nach Abschluss erledigen:Beachten Sie die
.
imgit 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 erhaltengit checkout
.Es ist auch eine gute Angewohnheit, bei der Übergabe eines Dateinamens diesen auszugleichen
--
, zgit 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 descheckout
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 Funktionfoo
in umbenennenbar
und jemand anderes neuen Code hinzufügt, der aufruftfoo
, 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 vonHEAD
(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
odergit 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 festschreibengit commit
.quelle
git add --all
alle Dateien zum Repository hinzugefügt werden, sodass möglicherweise mehr Dateien als beabsichtigt hinzugefügt werden, es sei denn, Ihre.gitignore
Muster befinden sich in einem perfekten Zustand.git add -u
ist wahrscheinlich besser für diese Situation geeignet. Es ist weniger wahrscheinlich, dass Sie Änderungen an nachverfolgten Dateien vornehmen, die Sie beim Auflösen einer Zusammenführung nicht hinzufügen möchten.git checkout --ours .
. Das.
ist wichtig; Durch die Übergabe eines Dateinamens (in diesem Fall des gesamten Verzeichnisses) wird zwischen zwei verschiedenen Betriebsmodi von ausgewähltcheckout
, von denen einer die Zweige wechselt und einer die Dateien vom Index in die Arbeitskopie verschiebt. Ich stimme zu, es ist sehr verwirrend. Sie können auchgit checkout --ours -- <filename>
eine einzelne Datei gleichzeitig auschecken.Stellen Sie sicher, dass der Konflikt entstanden ist: Wenn er das Ergebnis von a ist
git merge
, lesen Sie die Antwort von Brian Campbell .Wenn dies jedoch das Ergebnis von a ist
git rebase
, müssten Sie Folgendes tun , um entfernte Änderungen zu verwerfen und lokale Änderungen zu verwenden:Siehe " Warum ist die Bedeutung von"
ours
"und"theirs
"umgekehrt" ", um zu sehen, wieours
undtheirs
während einer Rebase ausgetauscht werden (da der Upstream- Zweig ausgecheckt ist).quelle