web-dev-qa-db-de.com

Ich bin in einen Zusammenführungskonflikt geraten. Wie kann ich die Zusammenführung abbrechen?

Ich habe git pull verwendet 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 und meine schlecht ist, daher sollten alle meine Änderungen verworfen werden. Wie kann ich das machen?

2314
Gwyn Morfey

Da Ihr pull nicht erfolgreich war, ist HEAD (nicht HEAD^) das letzte "gültige" Commit für Ihren Zweig:

git reset --hard HEAD

Das andere Teil, das Sie möchten, ist, die Änderungen Ihre Änderungen außer Kraft setzen zu lassen.

In älteren Versionen von git konnten Sie die Merge-Strategie "theirs" verwenden:

git pull --strategy=theirs remote_branch

Aber dies wurde inzwischen entfernt, wie in diese Nachricht von Junio ​​Hamano (der Git-Betreuer) erklärt. Wie in der Link vermerkt, würden Sie dies stattdessen tun:

git fetch Origin
git reset --hard Origin
2054
Pat Notz

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

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

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

Aus der Git Merge Manpage

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

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

Auch in Bezug auf nicht festgeschriebene Änderungen beim Starten einer Zusammenführung:

Wenn Sie Änderungen haben, die Sie nicht festschreiben möchten, bevor Sie eine Zusammenführung starten, git stash und git stash pop, nachdem Sie die Zusammenführung abgeschlossen oder abgebrochen haben.

1826
Carl
git merge --abort

Brechen Sie den aktuellen Konfliktlösungsprozess ab und versuchen Sie, den Status vor dem Zusammenführen wiederherzustellen.

Wenn beim Start der Zusammenführung nicht festgeschriebene Arbeitsbaumänderungen vorhanden waren, kann git merge --abort diese Änderungen in einigen Fällen nicht rekonstruieren. Es wird daher empfohlen, Ihre Änderungen immer festzuschreiben oder zu verstecken, bevor Sie git merge ausführen.

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

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

469
ignis

Es ist so einfach.

git merge --abort

Git selbst zeigt Ihnen die Lösung, wenn Sie in dieser Art von Schwierigkeiten sind und den Befehl git status ausführen.

git status

Hoffe das wird den Leuten helfen.

104

Ich denke es ist git reset was du brauchst.

Beachten Sie, dass git revert etwas ganz anderes bedeutet als svn revert - in Subversion werden Ihre (nicht festgeschriebenen) Änderungen durch das Zurücksetzen verworfen und die Datei aus dem Repository auf die aktuelle Version zurückgesetzt, während git revert macht ein Commit "rückgängig".

git reset sollte das Äquivalent von svn revert tun, dh, Ihre unerwünschten Änderungen verwerfen.

89
David Precious

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

Es besteht auch keine besondere Notwendigkeit, eine Zusammenführung mit einer anderen Strategie zurückzusetzen und durchzuführen. Die Konflikte wurden von git korrekt hervorgehoben und die Anforderung, die Änderungen der anderen Seiten zu akzeptieren, gilt nur für diese eine Datei.

Für eine nicht zusammengeführte Datei in einem Konflikt stellt git die allgemeine Basisversion, die lokale Version und die Remoteversion 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.

# 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 Remote-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
74
CB Bailey

Da Kommentare darauf hindeuten, dass git reset --merge ein Alias ​​für git merge --abort ist, sollte beachtet werden, dass git merge --abort nur mit git reset --merge übereinstimmt, vorausgesetzt, dass ein MERGE_HEAD vorhanden ist. Dies kann in der Git-Hilfe zum Merge-Befehl nachgelesen werden.

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

Wenn nach einer fehlgeschlagenen Zusammenführung kein MERGE_HEAD vorhanden ist, kann die fehlgeschlagene Zusammenführung mit git reset --merge rückgängig gemacht werden, jedoch nicht unbedingt mit git merge --abort, es handelt sich also nicht nur um alte und neue Syntax für das gleiche.

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

33
Martin G

Und wenn Sie am Ende einen Zusammenführungskonflikt haben und nichts festzuschreiben haben, der Zusammenführungsfehler jedoch weiterhin angezeigt wird, nachdem Sie alle unten genannten Befehle angewendet haben,

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

bitte entfernen

. git\index.lock

datei [Ausschneiden Einfügen an einem anderen Ort im Falle einer Wiederherstellung] und geben Sie dann einen der folgenden Befehle ein, je nachdem, welche Version Sie möchten.

git reset --hard HEAD
git reset --hard Origin

Ich hoffe, das hilft!!!

24
Nirav Mehta

Seit Git 1.6.1.3 git checkout kann von beiden Seiten einer Zusammenführung ausgecheckt werden:

_git checkout --theirs _widget.html.erb
_
17
Alain O'Dea

Eine Alternative, die den Status der Arbeitskopie beibehält, ist:

git stash
git merge --abort
git stash pop

Ich rate generell davon ab, da es praktisch wie das Zusammenführen in Subversion ist, da die Verzweigungsbeziehungen im folgenden Commit verworfen werden.

15
Alain O'Dea

Für dieses Szenario habe ich git fetch und git pull ausgeführt und dann festgestellt, dass der Upstream-Zweig kein Master-Zweig ist, was zu unerwünschten Konflikten führt.

git reset -merge 

Dies wurde zurückgesetzt, ohne meine lokalen Änderungen zurückzusetzen.

1
naamadheya

Ich fand, dass das Folgende für mich funktioniert (eine einzelne Datei auf den Status vor dem Zusammenführen zurücksetzen):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
1