Frage Ich bin in einen Merge-Konflikt geraten. Wie kann ich die Zusammenführung abbrechen?


ich benutzte git pull und hatte einen Zusammenführungskonflikt:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

Ich weiß, dass die andere Version der Datei gut ist und dass meine schlecht ist, so dass alle meine Änderungen aufgegeben werden sollten. Wie kann ich das machen?


1911
2017-09-19 13:21


Ursprung


Antworten:


Seit deinem pull war dann erfolglos HEAD (nicht HEAD^) ist das letzte "gültige" Commit in Ihrer Branche:

git reset --hard HEAD

Das andere Stück, das Sie wollen, ist, dass Ihre Änderungen Ihre Änderungen überschreiben.

Ältere Versionen von git erlaubten Ihnen, die Mergestrategie "ihre" zu verwenden:

git pull --strategy=theirs remote_branch

Aber das wurde seitdem entfernt, wie in diese Nachricht von Junio ​​Hamano (der Git-Betreuer). Wie in der LinkStattdessen würdest du das tun:

git fetch origin
git reset --hard origin

1727
2017-09-19 14:33



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

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

Stellen Sie wie immer sicher, dass Sie keine Änderungen ohne Commit vorgenommen haben, bevor Sie eine Zusammenführung starten.

Von dem git merge man page

git merge --abort ist äquivalent zu git reset --merge wann MERGE_HEAD ist anwesend.

MERGE_HEAD ist vorhanden, wenn eine Zusammenführung ausgeführt wird.

Auch bezüglich nicht festgeschriebener Änderungen beim Starten einer Zusammenführung:

Wenn Sie Änderungen haben, die Sie vor dem Beginn einer Zusammenführung nicht bestätigen möchten, einfach git stash sie vor dem Zusammenführen und git stash pop nach Abschluss der Zusammenführung oder Abbrechen.


1584
2018-03-28 23:16



git merge --abort

Brechen Sie den aktuellen Konfliktlösungsprozess ab und versuchen Sie zu rekonstruieren   der Zustand vor der Zusammenführung

Wenn beim Zusammenführen nicht festgeschriebene Änderungen am Arbeitsbaum vorhanden waren   gestartet, git merge --abort wird in einigen Fällen nicht in der Lage sein   rekonstruiere diese Veränderungen. Es wird daher immer empfohlen   Übernehmen oder speichern Sie Ihre Änderungen, bevor Sie Git Merge ausführen.

git merge --abort ist äquivalent zu git reset --merge wann    MERGE_HEAD ist anwesend.

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


378
2017-11-12 21:40



In diesem speziellen Anwendungsfall möchten Sie die Zusammenführung nicht wirklich abbrechen, sondern lösen Sie den Konflikt auf eine bestimmte Art und Weise.

Es ist auch nicht erforderlich, einen Merge mit einer anderen Strategie zurückzusetzen und durchzuführen. Die Konflikte wurden von Git korrekt hervorgehoben und die Anforderung, die Änderungen anderer Seiten zu akzeptieren, gilt nur für diese eine Datei.

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

# common base:
git show :1:_widget.html.erb

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

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

Der einfachste Weg, den Konflikt zu lösen, um die entfernte Version wö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

73
2017-09-20 10:41



Ich denke es ist git reset du brauchst.

Pass auf das auf git revert bedeutet etwas ganz anderes als, sagen wir, svn revert - In Subversion werden die (nicht festgeschriebenen) Änderungen rückgängig gemacht, wobei die Datei vom Repository auf die aktuelle Version zurückgesetzt wird git revert "löscht" einen Commit.

git reset sollte das Äquivalent von tun svn revertVerwerfen Sie also Ihre unerwünschten Änderungen.


72
2017-09-19 13:25



Da Kommentare darauf hindeuten git reset --merge ist ein Alias ​​für git merge --abortEs lohnt sich, dies zu beachten git merge --abort ist nur gleichwertig git reset --mergevorausgesetzt, dass a MERGE_HEAD ist anwesend. Dies kann in der Git-Hilfe für den Zusammenführungsbefehl gelesen werden.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Nach einer fehlgeschlagenen Zusammenführung, wenn es keine gibt MERGE_HEADkann die fehlgeschlagene Zusammenführung rückgängig gemacht werden git reset --merge aber nicht unbedingt mit git merge --abort, sie sind also nicht nur alte und neue Syntax für die gleiche Sache.

Persönlich finde ich git reset --merge viel leistungsfähiger für Szenarien, die der beschriebenen ähneln, und fehlgeschlagene Zusammenführungen im Allgemeinen.


29
2018-04-02 12:16



Seit Git 1.6.1.3 git checkout konnte auf beiden Seiten einer Zusammenführung auschecken:

git checkout --theirs _widget.html.erb

16
2017-07-17 01:29