3230 Stimmen

Ich bin auf einen Merge-Konflikt gestoßen. Wie breche ich den Merge ab?

Ich habe git pull benutzt und hatte einen Merge-Konflikt:

nicht zusammengeführt:   some_file.txt

Du befindest dich mitten in einem konfliktbehafteten Merge.

Wie kann ich meine Änderungen an der Datei aufgeben und nur die gezogenen Änderungen behalten?

48 Stimmen

Ich weiß, dass dies eine superalte Frage ist, aber möchtest du den gesamten Zusammenführungsvorgang abbrechen und den Branch, den du zusammenführen wolltest, nicht zusammenführen lassen? Oder möchtest du einfach nur diese eine Datei ignorieren als Teil eines größeren Zusammenführungsvorgangs, bei dem alle anderen Dateien normal zusammengeführt werden? Für mich impliziert dein Titel Ersteres, der Text deiner Frage möchte Letzteres. Die Antworten geben keine klare Antwort.

0 Stimmen

Ich habe einen ähnlichen Fall beim Commit, der besagt, dass der automatische Merge fehlgeschlagen ist; Konflikte beheben und dann das Ergebnis committen: [abgelehnt] gh-pages -> gh-pages (nicht-fast-forward)

4 Stimmen

Gwyn, es könnte nützlich sein, hier eine akzeptierte Antwort auszuwählen. Die am besten bewertete Antwort ist etwas weniger sicher als einige der aktuellen Lösungen, daher denke ich, dass es hilfreich wäre, andere hervorzuheben :)

88voto

DARK_C0D3R Punkte 1709

Sie können den Merge-Schritt entweder abbrechen:

git merge --abort

oder Sie können Ihre Änderungen behalten (auf welchem Branch Sie sich befinden)

git checkout --ours file1 file2 ...

ansonsten können Sie die Änderungen des anderen Branches behalten

git checkout --theirs file1 file2 ...

79voto

CB Bailey Punkte 693084

In diesem speziellen Anwendungsfall möchten Sie den Merge nicht wirklich abbrechen, sondern den Konflikt auf eine bestimmte Weise lösen.

Es besteht kein spezieller Bedarf, zurückzusetzen und einen Merge mit einer anderen Strategie durchzuführen. Die Konflikte wurden korrekt von git hervorgehoben und die Anforderung, die Änderungen der anderen Seiten zu akzeptieren, bezieht sich nur auf diese eine Datei.

Für eine nicht zusammengeführte Datei in einem Konflikt stellt git die gemeinsame Basis, lokale und entfernte Versionen der Datei im Index zur Verfügung. (Hier werden sie zur Verwendung in einem 3-Wege-Diff-Tool von git mergetool gelesen.) Sie können git show verwenden, um sie anzuzeigen.

# gemeinsame Basis:
git show :1:_widget.html.erb

# 'unser'
git show :2:_widget.html.erb

# 'ihr'
git show :3:_widget.html.erb

Der einfachste Weg, den Konflikt aufzulösen und die entfernte Version wortwörtlich zu verwenden, ist:

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

Oder, mit git >= 1.6.1:

git checkout --theirs _widget.html.erb

5 Stimmen

Vielen Dank für den Hinweis. Hat das nicht einen faden Beigeschmack eines schlechten Git-Benutzerinterfaces?

0 Stimmen

@Peter: Ich bin nicht überzeugt. Das gewünschte Ergebnis kann mit ein paar Grundbefehlen mit einfachen Optionen erreicht werden. Welche Verbesserungen würden Sie vorschlagen?

10 Stimmen

Ich denke, dass der Befehl git 1.6.1 Sinn macht und gut ist. Genau das hätte ich gewollt. Ich finde, die Lösung vor 1.6.1 ist unschön und erfordert Kenntnisse über andere Teile von git, die vom Merge-Resolution-Prozess getrennt sein sollten. Aber die neue Version ist großartig!

60voto

Martin G Punkte 15799

Kommentare deuten darauf hin, dass git reset --merge ein Alias für git merge --abort ist. Es ist erwähnenswert, dass git merge --abort nur äquivalent zu git reset --merge ist, wenn ein MERGE_HEAD vorhanden ist. Dies kann in der Git-Hilfe für den Merge-Befehl nachgelesen werden.

git merge --abort ist äquivalent zu git reset --merge, wenn MERGE_HEAD vorhanden ist.

Nach einem fehlgeschlagenen Merge, wenn es kein MERGE_HEAD gibt, kann der fehlgeschlagene Merge mit git reset --merge rückgängig gemacht werden, jedoch nicht unbedingt mit git merge --abort. Sie sind nicht nur alte und neue Syntax für dasselbe.

Persönlich finde ich git reset --merge viel mächtiger für Szenarien ähnlich wie das beschriebene und für fehlgeschlagene Merges im Allgemeinen.

2 Stimmen

Was bedeutet hier eigentlich "failed merge"? Ein Zusammenführen mit Konflikten oder etwas anderes? Oder um es anders auszudrücken: Wann ist MERGE_HEAD nicht vorhanden? Meine anschließende Frage besteht darin, den besseren Gebrauch von "git reset --merge" zu verstehen.

1 Stimmen

@Ewoks git stash apply hat bei mir einen Merge-Konflikt verursacht, aber git merge --abort hat nicht geholfen, während git reset --merge geholfen hat.

1 Stimmen

Müssen Sie dies verwenden, um einen fehlgeschlagenen Merge aufzulösen, hatte ich aus irgendeinem Grund keinen MERGE_HEAD, also hat git merge --abort nicht funktioniert.

33voto

Nirav Mehta Punkte 6663

Wenn Sie ein Merge-Konflikt haben und nichts zum Commiten haben, aber dennoch ein Merge-Fehler angezeigt wird. Nach Anwendung aller unten genannten Befehle,

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

Bitte entfernen Sie

.git\index.lock

Datei [ausschneiden und in einem anderen Ordner speichern im Falle einer Wiederherstellung] und geben Sie dann einen der folgenden Befehle je nach gewünschter Version ein.

git reset --hard HEAD
git reset --hard origin

Hoffe das hilft!!!

0 Stimmen

Fehler: Konnte Merge-Strategie 'theirs' nicht finden.

22voto

Daniel Punkte 1517

Möglicherweise entspricht das nicht dem, was der OP wollte, aber für mich habe ich versucht, einen stabilen Branch mit einem Feature-Branch zu mergen und es gab zu viele Konflikte. Ich habe es nicht geschafft, die Änderungen zurückzusetzen, da der HEAD durch viele Commits geändert wurde. Die einfache Lösung war also, ein Forced Checkout zu einem stabilen Branch durchzuführen. Dann können Sie zum anderen Branch wechseln und es wird sein wie vor dem Merge.

git checkout -f master

git checkout side-branch

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X