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

3944

In meiner Hauptniederlassung habe ich eine git merge some-other-branchlokale, aber nie die Änderungen an den Ursprungsmaster übertragen. Ich wollte nicht zusammenführen, also möchte ich es rückgängig machen. Beim Durchführen git statusnach meiner Zusammenführung wurde folgende Meldung angezeigt:

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

Aufgrund einiger Anweisungen, die ich gefunden habe , habe ich versucht zu rennen

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 Niederlassung durch eine beliebige Anzahl von Commits vorne liegt. Wie komme ich zu diesem Punkt zurück?

Matt Huggins
quelle
3
Wenn Sie die Geschichte bewahren müssen, gibt es mit anderen Worten eine Änderung, die jemals jemand von Ihnen gezogen hat oder die Sie irgendwohin verschoben haben. Verwenden Sie die Lösung in der Antwort von Yuri Ushakov unten!
Sedrik
6
Bitte deaktivieren Sie die aktuelle Gewinnerantwort. Sie ist unsicher (wie viele betonten), sammelt aber immer noch Stimmen. Für mich sieht "MBO" -s am besten aus, obwohl es viel weniger Punkte hat.
Inger
5
Wenn Sie die Geschichte bewahren müssen , verwenden Sie die unten stehende Yuri -Lösung ! (nur einen Link zu @Sedrik Kommentar hinzufügen)
Cregox
3
Dies ist eine großartige Ressource direkt von Github: Wie man (fast) alles mit Git rückgängig macht
jasonleonhard

Antworten:

4459

Mit der git reflogÜberprüfung, welches Commit vor dem Zusammenführen eins ist ( git reflogist 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

Sie erhalten 1 Commit zurück.

Beachten Sie, dass alle geänderten und nicht festgeschriebenen / nicht verwahrten Dateien auf ihren unveränderten Zustand zurückgesetzt werden . Um sie entweder fernzuhalten oder Änderungen --mergeunten zu sehen.


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

git reset --hard ORIG_HEAD

könnte zu besseren Ergebnissen führen, da Ihre Änderungen erhalten bleiben sollten. ORIG_HEADverweist direkt vor dem Zusammenführen auf ein Commit, sodass Sie nicht selbst danach suchen müssen.


Ein weiterer Tipp ist, den --mergeSchalter anstelle von zu verwenden, --hardda er Dateien nicht unnötig zurücksetzt:

git reset --merge ORIG_HEAD

--verschmelzen

Setzt den Index zurück und aktualisiert die Dateien im Arbeitsbaum, die sich zwischen <commit> und HEAD unterscheiden, behält jedoch diejenigen bei, die sich zwischen dem Index und dem Arbeitsbaum unterscheiden (dh Änderungen aufweisen, die nicht hinzugefügt wurden).

Marcin Gil
quelle
129
Ich denke nicht, dass dies (immer?) Funktionieren wird - das "vor dem Zusammenführen" ist das letzte Commit, das vom anderen Zweig zusammengeführt wurde - es wird nicht das letzte Festschreiben für den aktuellen Zweig sein . Recht? (Dies könnte nur ein Ergebnis dessen sein, was git logstandardmäßig angezeigt wird - möglicherweise gibt es eine andere Ausgabe von git logoder git reflogkönnte dafür verwendet werden)
John Bachir
6
Ich denke, es könnte davon abhängen, ob Sie Squash Merge.
Marcin Gil
29
@ JohnBachir ist richtig. In der git logAusgabe möchten Sie sich die beiden übergeordneten Commits ansehen. Eines ist das letzte Commit in Ihrer Branche, eines ist das letzte Commit in der Branche, in die Sie zusammengeführt wurden. Sie möchten git reset --harddas übergeordnete Commit für den Zweig festlegen, in den Sie zusammengeführt haben.
Justin
7
@JohnBachir: Solange das "Zusammenführen" nicht wirklich ein schneller Vorlauf ist, führt es zu einem neuen Commit, das oben im Protokoll steht, und dieses Commit hat zwei Eltern (oder mehr als zwei, wenn Sie einen Oktopus ausführen verschmelzen). Wenn Sie dieses eine Zusammenführungs-Commit entfernen, verschwinden auch alle älteren Commits, die durch das Zusammenführen eingegangen sind. Um sicher zu gehen, wird Ihnen nach einem Reset-Git mitgeteilt, wo sich der neue Kopf befindet: "HEAD befindet sich jetzt bei 88a04de <Commit-Nachricht>". Ich schaue mir das immer an, um sicherzugehen, dass ich dort gelandet bin, wo ich es erwartet hatte. Mein Projekt verwendet ein Standard-Namensschema für Zweige, um die Dinge unvergesslich zu machen.
Mark E. Haase
44
Was ich nützlich fand, war, mir "git reflog" anzuschauen und nach dem letzten Commit zu suchen, das ich in master gemacht habe. Dann tun Siegit reset --hard <commit_sha>
Max Williams
1456

Angenommen, Ihr lokaler Master war nicht vor dem Ursprung / Master, sollten Sie dies tun können

git reset --hard origin/master

Dann sollte Ihre lokale masterNiederlassung identisch aussehen mit origin/master.

randomguy3
quelle
71
@Carter ist eigentlich nicht die beste Antwort. Es ist möglich, dass Origin / Master kurz vor dem Zusammenführen durch einige Commits vor Ihrem lokalen Master liegt. In diesem Fall führt dies möglicherweise nicht zu den gewünschten Ergebnissen
Dhruva Sagar,
15
@ dhruva-sagar Ja, aber solange git nicht sagt, dass du zurück bist und nicht holst, sollte es dir gut gehen.
Kelvin
3
Vielen Dank! Dies ist perfekt, wenn (und nur wenn) Sie ein Remote-Repository haben.
Tomc
2
Nein, es ist nicht das perfekte für diese Frage, siehe die "Annahme" -Klausel. Die Antwort von MBO deckt tatsächlich diesen Fall ab, und der Fall, in dem die Zusammenführung nicht das einzige lokale Commit ist.
Inger
2
Vielleicht sollte diese Warnung noch einmal in die Antwort selbst eingehen
Cregox
1175

Siehe Kapitel 4 im Git-Buch und den Originalbeitrag von Linus Torvalds .

So machen Sie eine bereits gepuschte Zusammenführung rückgängig :

git revert -m 1 commit_hash

Stellen Sie sicher, dass Sie die Wiederherstellung rückgängig machen, wenn Sie den Zweig erneut festschreiben, wie Linus sagte.

Yuri Geinish
quelle
10
@perfectionist stimmte zu :) Art von Wunsch gab es eine Möglichkeit, diese Antwort auf eine andere Frage zu migrieren - (vielleicht gibt es?)
mikermcneil
Für weitere Informationen über
Revert
1
Um sicher zu sein, dass diese Wiederherstellung funktioniert hat, können Sie git diff hash1 hash2 ausführen, wobei hash1 die festgeschriebene Wiederherstellung und hash2 die alte Festschreibung ist, zu deren Status Sie zurückkehren wollten. Keine Ausgabe == Erfolg! Ich konnte mehrere Commits mehrmals rückgängig machen, indem ich die letzte Zusammenführung zurücksetzte und rückwärts arbeitete. git diff hat mir gezeigt, dass ich in dem Zustand gelandet bin, den ich wollte.
Robert Sinton
6
Beachten Sie, dass dies die Frage des Originalplakats nicht wirklich löst . Das Originalplakat wurde bereits verwendet git revert -m 1 <commit>. Das Problem ist, dass dadurch nicht die versehentliche Zusammenführung gelöscht wird, die er durchgeführt hat (und die er noch nicht durchgeführt hat). Die anderen Antworten mit Hard-Resets sind besser für das Problem des Originalplakats.
Dies ist eine großartige Ressource direkt von Github: Wie man (fast) alles mit Git rückgängig macht
jasonleonhard
986

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

git reset --merge ORIG_HEAD

Der Schiedsrichter ORIG_HEAD verweist auf das ursprüngliche Commit vor dem Zusammenführen.

(Die --mergeOption hat nichts mit dem Zusammenführen zu tun. Sie ist nur so git reset --hard ORIG_HEAD, aber sicherer, da sie keine nicht festgeschriebenen Änderungen berührt.)

Odinho - Velmont
quelle
17
Wenn Sie Ihren Arbeitsbaum seitdem verschmutzt haben, git reset --merge ORIG_HEADbleiben diese Änderungen erhalten.
Yingted
1
Dies ist die einzig richtige Antwort (ich sage nicht, dass dies die beste Antwort ist - beachten Sie den Unterschied). Nehmen wir an, ich habe beim Master drei Commits bei t1, t3 und t5 ausgeführt. Angenommen, ich habe in Zweig 1 drei Kommentare zu t2, t4 und t6 abgegeben (angenommen, t1, t2, t3, t4, t5 und t6 sind in chronologischer Reihenfolge). Ein ähnlicher Befehl setzt git reset --hard HEAD~5nur HEAD zurück (kann Commits sowohl in master als auch in branch1 entfernen). Nur die --mergeOption entfernt die merge.
Manu Manjunath
@Manu Die --mergeOption entfernt die Zusammenführung nicht, Sie können --hardsie auch verwenden. Es ist die Referenz ORIG_HEAD, die hier den Anhaltspunkt darstellt. Sie wird festgelegt, bevor Sie eine Zusammenführung mit der Stelle durchführen, an der Sie sich an diesem Punkt befinden. :)
Odinho - Velmont
@yingted was meinst du mit "Wenn du deinen Arbeitsbaum seitdem verschmutzt hast, behält git reset --merge ORIG_HEAD diese Änderungen bei." Meinten Sie, die Dateien nach dem Zusammenführen zu ändern? Wie auch immer, ich habe die Zusammenführung durchgeführt und dann einige Konflikte gelöst. Aber dann wollte ich die Zusammenführung zurücksetzen und tat, was in dieser Antwort angegeben ist. Alles war in Ordnung und meine nach der Zusammenführung vorgenommenen Änderungen wurden nicht beibehalten. Mein lokales Repo ähnelt genau der Position vor dem Zusammenführen.
Samitha Chathuranga
Der git reset --hard ORIG_HEADBefehl funktionierte perfekt für mich - möglicherweise hat mir die Tatsache geholfen, dass ich nach dem lokalen Vorgang, den git mergeich rückgängig machen wollte, keine weiteren Änderungen am Repository vorgenommen habe . Der Befehl setzt einfach den Status des Repositorys auf den Stand vor dem Zusammenführen zurück. Danke für den tollen Tipp!
Bluebinary
391

Wenn Sie bei neueren Git-Versionen die Zusammenführung noch nicht festgeschrieben haben und einen Zusammenführungskonflikt haben , können Sie einfach Folgendes tun:

git merge --abort

Von man git merge:

[Dies] kann nur ausgeführt werden, nachdem die Zusammenführung zu Konflikten geführt hat. git merge --abortbricht den Zusammenführungsprozess ab und versucht, den Zustand vor dem Zusammenführen zu rekonstruieren.

Travis Reeder
quelle
8
Seine Zusammenführung ist festgeschrieben, aber nicht vorangetrieben (siehe Titel). Er ist bereits zusammengeführt. Ihr Befehl funktioniert nur, wenn er sich noch mitten in einer Zusammenführung befindet
JBoy
135

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

git reset --hard HEAD^

Oder auch HEAD^^ , um dieses Commit zurückzusetzen. Sie können jederzeit eine vollständige SHA-Referenz angeben, wenn Sie nicht sicher sind, wie viele Schritte Sie zurückgehen sollten.

Falls Sie Probleme haben und Ihr Hauptzweig keine lokalen Änderungen hatte, können Sie auf zurücksetzen origin/master.

MBO
quelle
5
Die beste Antwort, IMHO, beinhaltet die eigene Antwort des OP (unter der Annahme, dass nur 1 Schritt zurückgesetzt werden muss, was im Q der Fall zu sein schien) sowie die Verknüpfung von randomguy3 (die funktioniert, wenn "Ihr Hauptzweig keine lokalen Änderungen hatte ")
Inger
4
Sie Kommentatoren, @Inger und @Konstantin, warum? Sie sind hierher gekommen, nachdem meine Antwort erstellt wurde, und sie ist korrekter. Nur einen Schritt nach oben zu gehen, ist oft falsch, und Sie müssen tatsächlich zählen, wie weit Sie gehen müssen. Git setzt bereits ORIG_HEADfür Sie, warum nicht verwenden?
Odinho - Velmont
Wird es auch lokale Änderungen zurücksetzen? #Bitte aktualisieren.
CoDe
Das hat bei mir perfekt funktioniert. Das Zurücksetzen des Kopfes ist viel sinnvoller als die Hälfte der Antworten hier.
Varda Elentári
HEAD ^ ist gleich Commit vor HEAD? und ^^ sind zwei Commits vor? Vermutlich funktioniert dies nicht mit Schnellvorlauf-Zusammenführungen?
Marcus Leon
87

In letzter Zeit habe ich verwendet git reflog, um dabei zu helfen. Dies funktioniert meistens nur, wenn die Zusammenführung NUR stattgefunden hat und sich auf Ihrem Computer befand.

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 stattgefunden hat. Die 2. Zeile ist die Zeit vor meiner Zusammenführung. Ich zwinge git reset --hard 43b6032diesen Zweig einfach dazu, ihn vor dem Zusammenführen zu verfolgen und weiterzumachen.

Parris
quelle
Tolle Antwort, danke! Musste eine Zusammenführung rückgängig machen, aber die anderen Antworten haben es nur noch mehr durcheinander gebracht reflog, um die SHA zu erhalten und diese an die git resetArbeit weiterzugeben .
Lankymart
51

Mit modernem Git können Sie:

git merge --abort

Ältere Syntax:

git reset --merge

Alte Schule:

git reset --hard

Aber eigentlich ist es wert , zu bemerken , dass git merge --abortnur äquivalent ist git reset --mergeda MERGE_HEADvorhanden ist. Dies kann in der Git-Hilfe zum Zusammenführen gelesen werden.

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

Nach einer fehlgeschlagenen Zusammenführung, wenn keine vorhanden ist MERGE_HEAD, kann die fehlgeschlagene Zusammenführung rückgängig gemacht werden git reset --merge, jedoch nicht unbedingt mit git merge --abort, sodass es sich nicht nur um alte und neue Syntax für dieselbe Sache handelt .

Persönlich finde ich es git reset --mergeviel leistungsfähiger und nützlicher in der täglichen Arbeit, also benutze ich das immer.

Martin G.
quelle
Hat super für mich funktioniert. Jeder andere Beitrag sagt, dass dies so kompliziert ist, aber genau das getan hat, was erwartet wird. Ich nehme an, es hat nur funktioniert, weil es Konflikte gab, die die ursprüngliche Frage nicht genau beantworten.
Jeremy
Diese Antwort konzentriert sich nicht auf die Situation des OP und lässt wichtige Zusammenhänge aus.
Ben Wheeler
37

Okay, die Antworten, die mir andere Leute hier gaben, waren nah, aber es hat nicht funktioniert. Folgendes habe ich getan.

Dies tun...

git reset --hard HEAD^
git status

... gab mir 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 mehrmals denselben git resetBefehl eingeben. 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.

Zu diesem Zeitpunkt sah ich, dass sich die Statusmeldung geändert hatte, also versuchte ich es mit a git pull, und 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

Kurz gesagt, meine Befehle lauteten wie folgt:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
Matt Huggins
quelle
19
oder du hättest es benutzen könnenHEAD^^^^
hasen
17
vielleicht sogar zurückgesetzt auf origin/master;)
hasen
23

Sie können verwenden git reflog, um die vorherige Kasse zu finden. Manchmal ist das ein guter Zustand, in den Sie zurückkehren möchten.

Konkret,

$ git reflog
$ git reset --hard HEAD@{0}
stephjang
quelle
1
Vielen Dank! Sie haben einen halben Tag meiner Arbeit gespart. Ich konnte den Reflog-Modus jedoch mit keinem Befehl verlassen.
Katarzyna
1
@ Katarzyna verwenden Sie die Taste "q", um das Reflog zu beenden
Amjed Baig
21

Wenn Sie sich gerade in der Zusammenführung befinden, können Sie diese jederzeit abbrechen git merge --abort

llioor
quelle
2
danke bro und ich wollte gerade diese gruselige sache richtig beantworten. Zum Glück habe ich nach unten gescrollt. Ich möchte nur Merge Head löschen
Nyuu
15

Ich konnte dieses Problem mit einem einzigen Befehl lösen, bei dem keine Commit-ID nachgeschlagen werden musste.

git reset --hard remotes/origin/HEAD

Die akzeptierte Antwort hat bei mir nicht funktioniert, aber dieser Befehl hat die gewünschten Ergebnisse erzielt.

Ralph Ritoch
quelle
Genau! Es setzt Ihre Änderungen auf den HEAD des Zweigs zurück! Nicht eins nach dem anderen tun
Carlos Zinato
hat bei mir nicht funktioniert. Tatsächlich schickte er die lokale Niederlassung ein oder zwei Monate zurück. Zum Glück ist das alles lokal, so dass ich den Zweig immer zerstören und wieder holen kann. Ich wollte nur darauf hinweisen, falls andere dies versuchten.
Matt Pengelly
@MattPengelly Diese Methode ist weitgehend undokumentiert und funktioniert normalerweise, wenn Ihr Zweig vor dem Zusammenführen mit dem Remote-Zweig synchronisiert ist. Ist es Monate her, dass Ihre Filiale mit der Remote-Filiale synchronisiert war?
Ralph Ritoch
@MattPengelly hängt auch davon ab, auf welchen Zweig der HEAD zeigt. Ich verwende gitflow für eines meiner Projekte, und obwohl ich mich im Entwicklungszweig befinde, wird auf remotes / origin / HEAD auf origin / master verwiesen. Wenn ich also eine Zusammenführung rückgängig machen müsste, müsste ich wahrscheinlich auf remotes zurücksetzen / Herkunft / Entwicklung
Ralph Ritoch
14

Wenn Sie es noch nicht festgeschrieben haben, können Sie es nur verwenden

$ git checkout -f

Dadurch wird die Zusammenführung rückgängig gemacht (und alles, was Sie getan haben).

Idealmind
quelle
Versuchte dies und es erhöhte tatsächlich die Anzahl der Commits, die meine lokale Niederlassung vor sich hat.
Barclay
14

Ich bin auf diese Frage gekommen und habe auch versucht, zum Ursprung zurückzukehren (dh KEINE Commits vor dem Ursprung). Weitere Nachforschungen haben ergeben, dass es resetgenau dafür einen Befehl gibt :

git reset --hard @{u}

Hinweis: @{u}ist eine Abkürzung für origin/master. (Und natürlich benötigen Sie dieses Remote-Repository, damit dies funktioniert.)

Leanne
quelle
14

Du musst deinen KOPF ändern, natürlich nicht deinen, aber git HEAD ....

Bevor wir antworten, fügen wir einige Hintergrundinformationen hinzu und erklären, was das ist HEAD.

First of all what is HEAD?

HEADist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.
Es kann immer nur eine einzige HEADgeben. (ohnegit worktree )

Der Inhalt von HEADwird darin gespeichert .git/HEADund enthält die 40 Bytes SHA-1 des aktuellen Commits.


detached HEAD

Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass HEADauf ein vorheriges Commit in der Geschichte verwiesen wird detached HEAD.

Geben Sie hier die Bildbeschreibung ein

In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweignamens, da der HEADnicht auf die Spitze des aktuellen Zweigs zeigt

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Einige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit verweist.
Dieser Befehl checkt zu einem bestimmten Commit aus.
An diesem Punkt können Sie einen Zweig erstellen und ab diesem Punkt mit der Arbeit beginnen.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können das auch immer verwenden reflog.
git reflogzeigt jede Änderung an, die das aktualisiert hat, HEADund das Auschecken des gewünschten Reflog-Eintrags setzt HEADdiesen Commit zurück.

Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der reflog

git reflog
git checkout HEAD@{...}

Dadurch kehren Sie zu Ihrem gewünschten Commit zurück

Geben Sie hier die Bildbeschreibung ein


git reset --hard <commit_id>

"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Hinweis: ( Seit Git 2.7 ) können
    Sie auch das verwenden git rebase --no-autostash.

git revert <sha-1>

"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl zum Zurücksetzen "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können, reset && checkoutändern Sie die HEAD.

Geben Sie hier die Bildbeschreibung ein

CodeWizard
quelle
Dies ist ein Schatz J
Jawand Singh
12

Die einfachste Antwort ist die von Odinho - Velmont

Zuerst tun git reset --merge ORIG_HEAD

Wenn Sie nach dem Übertragen von Änderungen zurücksetzen möchten, tun Sie dies (da dies der erste Beitrag ist, der für Fragen zum Zusammenführen von Git-Resets angezeigt wird).

git push origin HEAD --force

Dies wird so zurückgesetzt, dass Sie die zusammengeführten Änderungen nach dem Ziehen nicht wieder zurückerhalten.

Harsha
quelle
10

Nur um eine zusätzliche Option zu betrachten, habe ich mich hauptsächlich an das hier beschriebene Verzweigungsmodell gehalten: http://nvie.com/posts/a-successful-git-branching-model/ und als solches mit --no-ff(Nr schnell vorwärts) normalerweise.

Ich habe diese Seite gerade gelesen, als ich versehentlich einen Testzweig anstelle meines Release-Zweigs mit dem Master für die Bereitstellung zusammengeführt habe (Website, Master ist das, was live ist). Der Testzweig hat zwei weitere Zweige, die zusammengeführt wurden, und umfasst insgesamt etwa sechs Commits.

Um das gesamte Commit git reset --hard HEAD^rückgängig zu machen, brauchte ich nur eines und es hat das gesamte Zusammenführen rückgängig gemacht. Da die Zusammenführungen nicht schnell weitergeleitet wurden, war die Zusammenführung ein Block und ein Schritt zurück ist "Zweig nicht zusammengeführt".

Damien Byrne
quelle
10

Sie können nur zwei Befehle verwenden, um eine Zusammenführung oder einen Neustart durch ein bestimmtes Commit zurückzusetzen:

  1. git reset --hard commitHash (Sie sollten das Commit verwenden, das Sie neu starten möchten, z. B. 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (Senden des neuen lokalen Hauptzweigs an origin / master)

Viel Glück und mach weiter!

Matheus Abreu
quelle
10

Dies kann auf verschiedene Arten erfolgen.

1) Zusammenführung abbrechen

Wenn Sie sich zwischen einer fehlerhaften Zusammenführung befinden (fälschlicherweise mit einem falschen Zweig durchgeführt) und die Zusammenführung vermeiden möchten, um wie folgt zum neuesten Zweig zurückzukehren:

git merge --abort

2) Setzen Sie HEAD auf Remote Branch zurück

Wenn Sie vom Remote-Entwicklungszweig aus arbeiten, können Sie HEAD wie folgt auf das letzte Commit im Remote-Zweig zurücksetzen:

git reset --hard origin/develop

3) Löschen Sie den aktuellen Zweig und checken Sie ihn erneut aus dem Remote-Repository aus

In Anbetracht dessen, dass Sie an der Entwicklung eines Zweigs im lokalen Repo arbeiten, der mit dem Remote- / Entwicklungszweig synchronisiert wird, können Sie wie folgt vorgehen:

git checkout master 
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :) 

git branch -D develop
git checkout -b develop origin/develop
Amit Kaneria
quelle
dass "1) Merge abbrechen" hübsch genug war. Upvoting.
CodeToLife
1
Achtung! git merge --abort "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 dem Zusammenführen zu rekonstruieren"
Pedro García Medina
8

Wenn Ihre Zusammenführung und die entsprechenden Commits noch nicht verschoben wurden, können Sie jederzeit zu einem anderen Zweig wechseln, den ursprünglichen löschen und neu erstellen.

Zum Beispiel habe ich versehentlich einen Entwicklungszweig zum Master zusammengeführt und wollte das rückgängig machen. Verwenden Sie die folgenden Schritte:

git checkout develop
git branch -D master
git branch -t master origin/master

Voila! Der Master befindet sich im selben Stadium wie der Ursprung, und Ihr falsch zusammengeführter Zustand wird gelöscht.

Stephan
quelle
1
Hinweis: Dadurch wird nicht nur die Zusammenführung rückgängig gemacht, sondern auch alle lokalen Commits, die seit dem letzten Push-to-Origin vorgenommen wurden.
Martijn Heemels
4

Wenn Sie eine Befehlszeilenlösung wünschen, empfehle ich, nur die Antwort von MBO zu verwenden.

Wenn Sie ein Neuling sind, könnte Ihnen der grafische Ansatz gefallen:

  1. Starten Sie gitk(über die Befehlszeile oder klicken Sie mit der rechten Maustaste in den Dateibrowser, wenn Sie das haben)
  2. Sie können das Zusammenführungs-Commit dort leicht erkennen - den ersten Knoten von oben mit zwei Eltern
  3. Folgen Sie dem Link zum ersten / linken Elternteil (dem in Ihrem aktuellen Zweig vor dem Zusammenführen, normalerweise rot für mich).
  4. Klicken Sie beim ausgewählten Commit mit der rechten Maustaste auf "Zweig auf hier zurücksetzen" und wählen Sie dort den Hard-Reset aus
Inger
quelle
4

Strategie: Erstellen Sie eine neue Niederlassung, von der aus alles gut war.

Begründung: Das Zurücksetzen einer Zusammenführung ist schwierig. Es gibt zu viele Lösungen, abhängig von vielen Faktoren, z. B. ob Sie Ihre Zusammenführung festgeschrieben oder vorangetrieben haben oder ob seit Ihrer Zusammenführung neue Festschreibungen stattgefunden haben. Außerdem müssen Sie noch ein relativ tiefes Verständnis von Git haben, um diese Lösungen an Ihren Fall anzupassen. Wenn Sie blindlings einigen Anweisungen folgen, kann dies zu einer "leeren Zusammenführung" führen, bei der nichts zusammengeführt wird. Weitere Zusammenführungsversuche führen dazu, dass Git Ihnen "Bereits auf dem neuesten Stand" mitteilt.

Lösung:

Angenommen, Sie zusammenführen möchten devin feature-1.

  1. Suchen Sie die Revision, für die Sie die Zusammenführung erhalten möchten:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Probieren Sie es aus (gehen Sie in der Zeit zurück):

    git checkout e5f6g7h8
    
  3. Erstellen Sie von dort aus einen neuen Zweig und probieren Sie ihn aus:

    git checkout -b feature-1
    

Jetzt können Sie Ihre Zusammenführung neu starten:

  1. Verschmelzen: git merge dev

  2. Beheben Sie Ihre Zusammenführungskonflikte.

  3. Verpflichten: git commit

  4. Wenn Sie mit den Ergebnissen zufrieden sind, löschen Sie den alten Zweig: git branch --delete feature-1

pyb
quelle
2

Erstellen Sie einfach einen neuen Zweig und wählen Sie die gewünschten Commits aus.

Es ist sicherer und einfacher als das Zurücksetzen, wie in vielen Antworten oben beschrieben

devi
quelle
1
Ich stimme diesem Vorschlag zu, insbesondere wenn Sie mit den aufgeführten Git-Befehlen nicht ganz vertraut sind. Dies mag mit mehr "Mühe" langsamer sein, aber wenn es nicht viel aufkommt und Sie befürchten, Ihre Arbeit zu verlieren, ist es die Mühe wert.
Greg
1

Ich denke, Sie können tun, git rebase -i [hash] [branch_name] wo [hash]sich der identifizierende Hash befindet, für wie weit Sie zurückspulen möchten, plus eins (oder wie viele Commits Sie zurück möchten) und dann die Zeilen für die Commits im Editor löschen, die Sie nicht mehr möchten . Speicher die Datei. Ausgang. Beten. Und es sollte zurückgespult werden. Möglicherweise müssen Sie eine machen git reset --hard, aber es sollte an dieser Stelle gut sein. Sie können dies auch verwenden, um bestimmte Commits aus einem Stapel zu ziehen, wenn Sie sie nicht in Ihrem Verlauf behalten möchten, Ihr Repository jedoch in einem Zustand belassen kann, den Sie wahrscheinlich nicht möchten.

tychoish
quelle
1

Wenn Sie die Zusammenführung begangen haben:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
Dorian
quelle
1
  1. Stellen Sie zunächst sicher, dass Sie alles festgelegt haben.

  2. Setzen Sie dann Ihr Repository auf den vorherigen Arbeitszustand zurück:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    oder using --hard( dies entfernt alle lokalen, nicht festgeschriebenen Änderungen! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    Verwenden Sie den Hash, der vor Ihrem falsch zusammengeführten Commit vorhanden war.

  3. Überprüfen Sie, welche Commits Sie oben auf der vorherigen korrekten Version erneut festschreiben möchten, indem Sie:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. Wenden Sie Ihre richtigen Commits oben auf der richtigen Version Ihres Repositorys an, indem Sie:

    • Durch die Verwendung von Cherry-Pick (die Änderungen, die durch einige vorhandene Commits eingeführt wurden)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • Oder indem Sie die Auswahl an Commits auswählen, indem Sie:

      • Überprüfen Sie zuerst die richtigen Änderungen, bevor Sie sie zusammenführen:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • Überprüfen Sie zuerst die richtigen Änderungen, bevor Sie sie zusammenführen:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        Dabei ist dies der Bereich der korrekten Commits, die Sie festgeschrieben haben (ausgenommen falsch festgeschriebene Zusammenführungen).

Kenorb
quelle
1
  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

Das hat bei mir funktioniert .. !!

Siva Kumar
quelle
0

Wenn Sie feststellen, dass Sie unmittelbar nach dem Zusammenführen zurücksetzen müssen und nach dem Zusammenführungsversuch nichts anderes getan haben, können Sie einfach den folgenden Befehl ausführen : git reset --hard HEAD@{1}.

Im Wesentlichen zeigt Ihre Zusammenführung shadarauf, HEAD@{0}ob nach der Zusammenführung nichts anderes festgeschrieben wurde, und dies HEAD@{1}ist auch der vorherige Punkt vor der Zusammenführung.

Dut A.
quelle
0

Die einfachste der einfachsten Chance, viel einfacher als alles, was hier gesagt wird:

Entfernen Sie Ihren lokalen Zweig (lokal, nicht remote) und ziehen Sie ihn erneut. Auf diese Weise machen Sie die Änderungen in Ihrem Hauptzweig rückgängig und jeder ist von der Änderung betroffen, die Sie nicht verschieben möchten. Fangen Sie von vorne an.

Luis
quelle
0

In diesem Fall möchten Sie Ihren Zweig mit zurücksetzen git reset --hard <branch_name>. Wenn Sie Ihre Änderungen vor dem Zurücksetzen speichern möchten, müssen Sie einen neuen Zweig erstellen und git checkout <branch_name>.

Sie können den Status auch mit auf ein bestimmtes Commit zurücksetzen git reset --hard <commit_id>.

Wenn die Änderungen übernommen wurden, können Sie sie git revert <branch_name>stattdessen verwenden. Lesen Sie auch in anderen Szenarien , wie Sie git revert und git checkout verwenden .

Nesha Zoric
quelle