3161 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?

47 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 :)

2741voto

Pat Notz Punkte 196406

Da dein pull nicht erfolgreich war, ist HEAD (nicht HEAD^) der letzte "gültige" Commit auf deinem Branch:

git reset --hard HEAD

Das andere, was du tun möchtest, ist, dass ihre Änderungen deine Änderungen überschreiben.

Ältere Versionen von git erlaubten es dir, die "theirs" Merge-Strategie zu verwenden:

git pull --strategy=theirs remote_branch

Aber das wurde inzwischen entfernt, wie in dieser Nachricht von Junio Hamano (dem Git-Wartungsbeauftragten) erklärt. Wie in dem Link erwähnt, würdest du stattdessen dies tun:

git fetch origin
git reset --hard origin

58 Stimmen

Anstatt einen harten Reset durchzuführen, könnten Sie auf eine granulare Ebene kommen und Folgendes tun: git fetch origin --> git reset origin (weicher Reset, Ihre Änderungen sind immer noch vorhanden) --> git checkout file_to_use_their_version_of another_file (Ihre eigenen Änderungen zurückrollen, um mit dem Ursprung übereinzustimmen) Ich benutze nie git pull mehr. Da im Kampf zwischen meinem neuesten Code und dem Ursprung der Ursprung immer gewinnen sollte, führe ich immer git fetch und git rebase origin durch. Dadurch werden meine Zusammenführungen und Konflikte tatsächlich selten.

7 Stimmen

Ich stimme zu. Ich ziehe es auch vor, zuerst abzurufen und dann die Änderungen stromaufwärts zu überprüfen (git log ..@{upstream} oder git diff ..@{upstream}). Danach werde ich wie du meine Arbeit neu basieren.

2 Stimmen

Zusätzlich dazu empfehle ich, "git clean -f" auszuführen, wenn Sie immer noch einige nicht nachverfolgte Dateien bereinigen möchten.

2351voto

Carl Punkte 41134

Wenn Ihre Git-Version >= 1.6.1 ist, können Sie git reset --merge verwenden.

Wie auch @Michael Johnson erwähnt, wenn Ihre Git-Version >= 1.7.4 ist, können Sie auch git merge --abort verwenden.

Stellen Sie wie immer sicher, dass Sie keine nicht übertragenen Änderungen haben, bevor Sie einen Merge starten.

Aus der Git Merge-Manualseite

git merge --abort entspricht git reset --merge, wenn MERGE_HEAD vorhanden ist.

MERGE_HEAD ist vorhanden, wenn ein Merge im Gange ist.

Auch bezüglich nicht übertragener Änderungen beim Starten eines Merges:

Wenn Sie Änderungen haben, die Sie nicht übertragen möchten, bevor Sie einen Merge starten, einfach git stash sie vor dem Merge und git stash pop nach Abschluss des Merges oder Abbruch.

3 Stimmen

Interessant - aber das Handbuch macht mir Angst. Wann genau ist es angemessen zu verwenden? Wann müssten Sie das optionale angeben? #GitMoment :-o

1 Stimmen

Sie würden dies in der Regel verwenden, wenn Sie das Verschmelzen von Anfang an neu durchführen möchten. Ich musste noch nie das optionale Commit selbst angeben, daher ist der Standard (kein optionales ) völlig ausreichend.

54 Stimmen

Ich wünschte, diese Antwort hätte mehr Stimmen! Zu diesem Zeitpunkt scheint es in vielen Fällen die relevanteste Lösung zu sein.

642voto

ignis Punkte 8375
git merge --abort

Beenden Sie den aktuellen Konfliktlösungsprozess und versuchen Sie, den Zustand vor dem Zusammenführen wiederherzustellen.

Wenn unbestätigte Änderungen im Arbeitsverzeichnis vorhanden waren, als der Merge begann, kann git merge --abort in einigen Fällen diese Änderungen nicht wiederherstellen. Es wird daher empfohlen, Ihre Änderungen immer zu bestätigen oder zu verwerfen, bevor Sie den Git-Merge-Befehl ausführen.

git merge --abort entspricht git reset --merge, wenn MERGE_HEAD vorhanden ist.

http://www.git-scm.com/docs/git-merge

20 Stimmen

Das ist seit Git v1.7.4 verfügbar. Es ist ein Alias für git reset --merge.

116voto

David Precious Punkte 6455

Ich glaube, du brauchst git reset.

Achte darauf, dass git revert etwas ganz anderes bedeutet als z.B. svn revert - in Subversion wird das Zurücksetzen deine (nicht übermittelten) Änderungen verwerfen und die Datei auf die aktuelle Version aus dem Repository zurücksetzen, während git revert einen Commit "rückgängig" macht.

git reset sollte das Äquivalent von svn revert sein, also deine unerwünschten Änderungen verwerfen.

91voto

Hanzla Habib Punkte 2607

Für git >= 1.6.1:

git merge --abort

Für ältere Versionen von git wird dies funktionieren:

git reset --merge

oder

git reset --hard

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