Frage Machen Sie eine Git-Zusammenführung rückgängig, die noch nicht gedrückt wurde


In meinem Master-Zweig habe ich einen git merge some-other-branch lokal, aber nie die Änderungen an Ursprungsmaster geschoben. Ich wollte nicht verschmelzen, also möchte ich es rückgängig machen. Wenn du a git status Nach meiner Zusammenführung erhielt ich diese Nachricht:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Basiert auf einigen Anweisungen, die ich gefunden habeIch habe versucht zu laufen

git revert HEAD -m 1

aber jetzt bekomme ich diese Nachricht mit git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Ich möchte nicht, dass meine Branche durch irgendeine Anzahl von Commits voraus ist. Wie komme ich zurück zu diesem Punkt?


3075
2018-03-05 19:24


Ursprung


Antworten:


Mit git reflog Überprüfen Sie, welcher Commit vor der Zusammenführung erfolgt (git reflog ist eine bessere Option als git log). Dann können Sie es zurücksetzen mit:

git reset --hard commit_sha

Es gibt auch einen anderen Weg

git reset --hard HEAD~1

Du bekommst 1 Commit zurück.

Beachten Sie, dass alle geänderten und nicht festgeschriebenen / nicht gestarteten Dateien in den unveränderten Zustand zurückgesetzt werden. Um sie entweder verstauen zu lassen oder zu sehen --merge Option unten.


Wie @Velmont unten in seiner Antwort vorgeschlagen hat, in diesem direkten Fall mit:

git reset --hard ORIG_HEAD

könnte zu besseren Ergebnissen führen, da die Änderungen beibehalten werden sollten. ORIG_HEAD wird direkt vor dem Zusammenführen auf ein Commit zeigen, so dass Sie nicht selbst danach suchen müssen.


Ein weiterer Tipp ist die Verwendung der --merge wechseln statt --hard da es Dateien nicht unnötig zurücksetzt:

--verschmelzen

Setzt den Index zurück und aktualisiert die Dateien in der Arbeitsbaumstruktur, die sich zwischen <commit> und HEAD unterscheiden, behält jedoch die Unterschiede zwischen dem Index und dem Arbeitsbaum bei (d. H. Die Änderungen haben, die nicht hinzugefügt wurden).


3368
2018-03-05 19:34



Angenommen, Ihr lokaler Master war nicht vor dem Ursprung / Master, sollten Sie in der Lage sein zu tun

git reset --hard origin/master

Dann dein Lokal master Zweig sollte identisch aussehen origin/master.


1289
2018-03-17 18:06



Sehen Kapitel 4 im Git Buch und der ursprüngliche Beitrag von Linus Torvalds.

So machen Sie eine Zusammenführung rückgängig das war schon gedrängt:

git revert -m 1 commit_hash

Stellen Sie sicher, dass Sie die Zurücksetzung wiederherstellen, wenn Sie den Zweig erneut ausführen, wie Linus sagte.


1083
2018-06-02 16:31



Es ist seltsam, dass der einfachste Befehl fehlte. Die meisten Antworten funktionieren, aber die Zusammenführung rückgängig machen, die Sie gerade getan haben, Das ist der einfache und sichere Weg:

git reset --merge ORIG_HEAD

Der Schiedsrichter ORIG_HEAD zeigt auf das ursprüngliche Commit vor der Zusammenführung.

(Das --merge Option hat nichts mit der Zusammenführung zu tun. Es ist einfach so git reset --hard ORIG_HEAD, aber sicherer, da nicht festgeschriebene Änderungen nicht berührt werden.)


831
2018-01-29 15:46



Bei neueren Git-Versionen, wenn Sie die Zusammenführung noch nicht festgelegt haben und Sie haben einen Zusammenführungskonflikt, Sie können einfach tun:

git merge --abort

Von man git merge:

[This] kann nur ausgeführt werden, nachdem die Zusammenführung zu Konflikten geführt hat. git merge --abort bricht den Zusammenführungsprozess ab und versucht, den Zustand vor der Zusammenführung zu rekonstruieren.


306
2018-02-12 02:13



Sie sollten auf das vorherige Commit zurücksetzen. Das sollte funktionieren:

git reset --hard HEAD^

Oder auch HEAD^^ um das Zurücksetzen zu rückgängig zu machen. Sie können immer eine vollständige SHA-Referenz angeben, wenn Sie nicht sicher sind, wie viele Schritte Sie zurücklegen sollten.

Wenn Sie Probleme haben und Ihr Master-Zweig keine lokalen Änderungen hatte, können Sie auf zurücksetzen origin/master.


104
2018-03-05 19:31



In letzter Zeit habe ich benutzt git reflog um damit zu helfen. Das funktioniert meistens nur dann, wenn die Zusammenführung JUST passierte und es auf Ihrem Rechner war.

git reflog könnte etwas zurückgeben wie:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

Die erste Zeile zeigt an, dass eine Zusammenführung aufgetreten ist. Die zweite Zeile ist die Zeit vor meiner Zusammenführung. Ich habe einfach git reset --hard 43b6032 um zu erzwingen, dass diese Verzweigung von vor der Zusammenführung verfolgt wird, und weitermachen.


78
2017-12-19 17:51



Mit modernem Git können Sie:

git merge --abort

Ältere Syntax:

git reset --merge

Alte Schule:

git reset --hard

Aber eigentlich ist es das wert, dies zu bemerken git merge --abort ist nur gleichwertig git reset --merge das gegeben 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 und nützlicher in der täglichen Arbeit, das ist die, die ich immer benutze.


42
2018-05-08 19:13



Okay, die Antworten, die andere Leute mir gaben, waren eng, aber es hat nicht funktioniert. Hier ist was ich getan habe.

Dies tun...

git reset --hard HEAD^
git status

... gab mir den folgenden Status.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Ich musste dann dasselbe eingeben git reset befehle mehrere Male. Jedes Mal, wenn ich das tat, änderte sich die Nachricht um eins, wie Sie unten sehen können.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

An diesem Punkt sah ich die Statusnachricht geändert, also habe ich versucht, a git pullund das schien zu funktionieren:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Lange Rede kurzer Sinn, meine Befehle kamen daher:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

32
2018-03-05 19:54