In meiner Hauptniederlassung habe ich eine git merge some-other-branch
lokale, 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 status
nach 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?
Antworten:
Mit der
git reflog
Überprüfung, welches Commit vor dem Zusammenführen eins ist (git reflog
ist eine bessere Option alsgit log
). Dann können Sie es zurücksetzen mit:Es gibt auch einen anderen Weg:
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
--merge
unten zu sehen.Wie @Velmont unten in seiner Antwort vorgeschlagen hat, verwenden Sie in diesem direkten Fall:
könnte zu besseren Ergebnissen führen, da Ihre Änderungen erhalten bleiben sollten.
ORIG_HEAD
verweist direkt vor dem Zusammenführen auf ein Commit, sodass Sie nicht selbst danach suchen müssen.Ein weiterer Tipp ist, den
--merge
Schalter anstelle von zu verwenden,--hard
da er Dateien nicht unnötig zurücksetzt:quelle
git log
standardmäßig angezeigt wird - möglicherweise gibt es eine andere Ausgabe vongit log
odergit reflog
könnte dafür verwendet werden)git log
Ausgabe 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öchtengit reset --hard
das übergeordnete Commit für den Zweig festlegen, in den Sie zusammengeführt haben.git reset --hard <commit_sha>
Angenommen, Ihr lokaler Master war nicht vor dem Ursprung / Master, sollten Sie dies tun können
Dann sollte Ihre lokale
master
Niederlassung identisch aussehen mitorigin/master
.quelle
Siehe Kapitel 4 im Git-Buch und den Originalbeitrag von Linus Torvalds .
So machen Sie eine bereits gepuschte Zusammenführung rückgängig :
Stellen Sie sicher, dass Sie die Wiederherstellung rückgängig machen, wenn Sie den Zweig erneut festschreiben, wie Linus sagte.
quelle
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.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 :
Der Schiedsrichter
ORIG_HEAD
verweist auf das ursprüngliche Commit vor dem Zusammenführen.(Die
--merge
Option hat nichts mit dem Zusammenführen zu tun. Sie ist nur sogit reset --hard ORIG_HEAD
, aber sicherer, da sie keine nicht festgeschriebenen Änderungen berührt.)quelle
git reset --merge ORIG_HEAD
bleiben diese Änderungen erhalten.git reset --hard HEAD~5
nur HEAD zurück (kann Commits sowohl in master als auch in branch1 entfernen). Nur die--merge
Option entfernt diemerge
.--merge
Option entfernt die Zusammenführung nicht, Sie können--hard
sie 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. :)git reset --hard ORIG_HEAD
Befehl funktionierte perfekt für mich - möglicherweise hat mir die Tatsache geholfen, dass ich nach dem lokalen Vorgang, dengit merge
ich 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!Wenn Sie bei neueren Git-Versionen die Zusammenführung noch nicht festgeschrieben haben und einen Zusammenführungskonflikt haben , können Sie einfach Folgendes tun:
Von
man git merge
:quelle
Sie sollten auf das vorherige Commit zurücksetzen. Das sollte funktionieren:
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
.quelle
ORIG_HEAD
für Sie, warum nicht verwenden?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: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 43b6032
diesen Zweig einfach dazu, ihn vor dem Zusammenführen zu verfolgen und weiterzumachen.quelle
reflog
, um die SHA zu erhalten und diese an diegit reset
Arbeit weiterzugeben .Mit modernem Git können Sie:
Ältere Syntax:
Alte Schule:
Aber eigentlich ist es wert , zu bemerken , dass
git merge --abort
nur äquivalent istgit reset --merge
daMERGE_HEAD
vorhanden ist. Dies kann in der Git-Hilfe zum Zusammenführen gelesen werden.Nach einer fehlgeschlagenen Zusammenführung, wenn keine vorhanden ist
MERGE_HEAD
, kann die fehlgeschlagene Zusammenführung rückgängig gemacht werdengit reset --merge
, jedoch nicht unbedingt mitgit merge --abort
, sodass es sich nicht nur um alte und neue Syntax für dieselbe Sache handelt .Persönlich finde ich es
git reset --merge
viel leistungsfähiger und nützlicher in der täglichen Arbeit, also benutze ich das immer.quelle
Okay, die Antworten, die mir andere Leute hier gaben, waren nah, aber es hat nicht funktioniert. Folgendes habe ich getan.
Dies tun...
... gab mir folgenden Status.
Ich musste dann mehrmals denselben
git reset
Befehl eingeben. Jedes Mal, wenn ich das tat, änderte sich die Nachricht um eins, wie Sie unten sehen können.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:Kurz gesagt, meine Befehle lauteten wie folgt:
quelle
HEAD^^^^
origin/master
;)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,
quelle
Wenn Sie sich gerade in der Zusammenführung befinden, können Sie diese jederzeit abbrechen
git merge --abort
quelle
Ich konnte dieses Problem mit einem einzigen Befehl lösen, bei dem keine Commit-ID nachgeschlagen werden musste.
Die akzeptierte Antwort hat bei mir nicht funktioniert, aber dieser Befehl hat die gewünschten Ergebnisse erzielt.
quelle
Wenn Sie es noch nicht festgeschrieben haben, können Sie es nur verwenden
Dadurch wird die Zusammenführung rückgängig gemacht (und alles, was Sie getan haben).
quelle
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
reset
genau dafür einen Befehl gibt :git reset --hard @{u}
Hinweis:
@{u}
ist eine Abkürzung fürorigin/master
. (Und natürlich benötigen Sie dieses Remote-Repository, damit dies funktioniert.)quelle
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?
HEAD
ist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.Es kann immer nur eine einzige
HEAD
geben. (ohnegit worktree
)Der Inhalt von
HEAD
wird darin gespeichert.git/HEAD
und enthält die 40 Bytes SHA-1 des aktuellen Commits.detached HEAD
Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass
HEAD
auf ein vorheriges Commit in der Geschichte verwiesen wirddetached HEAD
.In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweignamens, da der
HEAD
nicht auf die Spitze des aktuellen Zweigs zeigtEinige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
git checkout
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.
git reflog
Sie können das auch immer verwenden
reflog
.git reflog
zeigt jede Änderung an, die das aktualisiert hat,HEAD
und das Auschecken des gewünschten Reflog-Eintrags setztHEAD
diesen Commit zurück.Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der
reflog
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset --hard <commit_id>
"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.
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.
Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können,
reset && checkout
ändern Sie dieHEAD
.quelle
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.
quelle
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".quelle
Sie können nur zwei Befehle verwenden, um eine Zusammenführung oder einen Neustart durch ein bestimmtes Commit zurückzusetzen:
git reset --hard commitHash
(Sie sollten das Commit verwenden, das Sie neu starten möchten, z. B. 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Senden des neuen lokalen Hauptzweigs an origin / master)Viel Glück und mach weiter!
quelle
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:
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:
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:
quelle
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:
Voila! Der Master befindet sich im selben Stadium wie der Ursprung, und Ihr falsch zusammengeführter Zustand wird gelöscht.
quelle
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:
gitk
(über die Befehlszeile oder klicken Sie mit der rechten Maustaste in den Dateibrowser, wenn Sie das haben)quelle
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
dev
infeature-1
.Suchen Sie die Revision, für die Sie die Zusammenführung erhalten möchten:
Probieren Sie es aus (gehen Sie in der Zeit zurück):
Erstellen Sie von dort aus einen neuen Zweig und probieren Sie ihn aus:
Jetzt können Sie Ihre Zusammenführung neu starten:
Verschmelzen:
git merge dev
Beheben Sie Ihre Zusammenführungskonflikte.
Verpflichten:
git commit
Wenn Sie mit den Ergebnissen zufrieden sind, löschen Sie den alten Zweig:
git branch --delete feature-1
quelle
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
quelle
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 machengit 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.quelle
Wenn Sie die Zusammenführung begangen haben:
quelle
Stellen Sie zunächst sicher, dass Sie alles festgelegt haben.
Setzen Sie dann Ihr Repository auf den vorherigen Arbeitszustand zurück:
oder using
--hard
( dies entfernt alle lokalen, nicht festgeschriebenen Änderungen! ):Verwenden Sie den Hash, der vor Ihrem falsch zusammengeführten Commit vorhanden war.
Überprüfen Sie, welche Commits Sie oben auf der vorherigen korrekten Version erneut festschreiben möchten, indem Sie:
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)
Oder indem Sie die Auswahl an Commits auswählen, indem Sie:
Überprüfen Sie zuerst die richtigen Änderungen, bevor Sie sie zusammenführen:
Überprüfen Sie zuerst die richtigen Änderungen, bevor Sie sie zusammenführen:
Dabei ist dies der Bereich der korrekten Commits, die Sie festgeschrieben haben (ausgenommen falsch festgeschriebene Zusammenführungen).
quelle
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Das hat bei mir funktioniert .. !!
quelle
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
sha
darauf,HEAD@{0}
ob nach der Zusammenführung nichts anderes festgeschrieben wurde, und diesHEAD@{1}
ist auch der vorherige Punkt vor der Zusammenführung.quelle
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.
quelle
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 undgit 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 .quelle