In meiner Master-Niederlassung habe ich lokal einen git merge some-other-branch
durchgeführt, die Änderungen jedoch nie an Origin-Master weitergeleitet. Ich wollte nicht verschmelzen, also möchte ich es ungeschehen machen. Bei einem git status
nach meiner Zusammenführung erhielt ich folgende Nachricht:
# On branch master
# Your branch is ahead of 'Origin/master' by 4 commits.
Basierend auf einigen Anweisungen, die ich gefunden habe , habe ich versucht zu laufen
git revert HEAD -m 1
aber jetzt erhalte 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 mit einer Reihe von Commits vorn liegt. Wie komme ich zu diesem Punkt zurück?
Überprüfen Sie mit git reflog
, welches Commit vor dem Zusammenführen ist (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
Sie erhalten 1 Commit zurück.
Seien Sie sich bewusst, dass geänderte und nicht festgeschriebene/ungeordnete Dateien in ihren nicht geänderten Zustand zurückgesetzt werden . Um sie zu behalten, können Sie entweder Änderungen speichern oder die --merge
-Option unten sehen.
Wie @Velmont in seiner Antwort unten vorgeschlagen hat, in diesem direkten Fall:
git reset --hard ORIG_HEAD
kann zu besseren Ergebnissen führen, da Ihre Änderungen erhalten bleiben sollen. ORIG_HEAD
zeigt direkt vor dem Zusammenführen auf ein Commit, sodass Sie nicht selbst danach suchen müssen.
Ein weiterer Tipp ist die Verwendung des Befehls --merge
anstelle von --hard
, da Dateien nicht unnötig zurückgesetzt werden:
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 die Dateien bei, die sich zwischen Index und Arbeitsbaum unterscheiden (d. H. Änderungen, die nicht hinzugefügt wurden).
Vorausgesetzt, Ihr lokaler Master war nicht vor Origin/master, sollten Sie dies können
git reset --hard Origin/master
Dann sollte Ihr lokaler master
-Zweig identisch mit Origin/master
aussehen.
Siehe Kapitel 4 im Git-Buch und den ursprünglichen Beitrag von Linus Torvalds .
So machen Sie eine Zusammenführung rückgängig: die bereits gedrückt wurde:
git revert -m 1 commit_hash
Stellen Sie sicher, dass Sie die Wiederherstellung rückgängig machen, wenn Sie den Zweig erneut festlegen, wie Linus sagte.
Es ist merkwürdig, dass der einfachste Befehl fehlte. Die meisten Antworten funktionieren, aber die gerade durchgeführte Verschmelzung rückgängig machen, dies ist der einfache und sichere Weg :
git reset --merge ORIG_HEAD
Der ref ORIG_HEAD
zeigt auf das ursprüngliche Commit vor der Zusammenführung.
(Die --merge
-Option hat nichts mit der Zusammenführung zu tun. Sie ist wie git reset --hard ORIG_HEAD
, aber sicherer, da sie nicht festgeschriebene Änderungen berührt.)
Wenn Sie bei neueren Git-Versionen die Zusammenführung noch nicht festgelegt haben und Sie einen Zusammenführungskonflikt haben, können Sie Folgendes tun:
git merge --abort
Von man git merge
:
[Dieses] kann nur ausgeführt werden, nachdem die Zusammenführung zu Konflikten geführt hat.
git merge --abort
bricht den Zusammenführungsvorgang ab und versucht, den Zustand vor dem Zusammenführen zu rekonstruieren.
Sie sollten auf den vorherigen Commit zurücksetzen. Das sollte funktionieren:
git reset --hard HEAD^
Oder sogar HEAD^^
, um das Zurücksetzungs-Commit 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 sollen.
Falls Sie Probleme haben und Ihr Master-Zweig keine lokalen Änderungen hatte, können Sie auf Origin/master
zurücksetzen.
In letzter Zeit habe ich git reflog
verwendet, um mir dabei zu helfen. Dies funktioniert meistens nur, wenn die Zusammenführung JUST passiert ist und sich auf Ihrem Computer befand.
git reflog
könnte etwas zurückgeben:
fbb0c0f [email protected]{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 [email protected]{1}: checkout: moving from master to my-branch
e3753a7 [email protected]{2}: rebase finished: returning to refs/heads/master
e3753a7 [email protected]{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 [email protected]{4}: reset: moving to HEAD^
8400a0f [email protected]{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 git reset --hard 43b6032
einfach, um diesen Zweig vor dem Zusammenführen und dem Weitermachen zu verfolgen.
Mit modernem Git können Sie:
git merge --abort
Ältere Syntax:
git reset --merge
Alte Schule:
git reset --hard
Tatsächlich lohnt es sich jedoch zu beachten, dass git merge --abort
nur äquivalent zu git reset --merge
ist, wenn MERGE_HEAD
vorhanden 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 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
,, so dass sie nicht nur alte und neue Syntax für dieselbe Sache sind .
Persönlich finde ich git reset --merge
viel leistungsfähiger und nützlicher im Arbeitsalltag, daher verwende ich diesen immer.
Okay, die Antworten, die andere Leute hier gaben, waren nahe, aber es hat nicht funktioniert. Hier ist was ich getan habe.
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 den gleichen git reset
-Befehl eingeben. Jedes Mal, wenn ich das tat, verä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 habe ich gesehen, dass sich die Statusmeldung geändert hat, also habe ich versucht, einen git pull
auszuführen, 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
Um es kurz zu machen, meine Kommandos hatten folgende Bedeutung:
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
Sie können git reflog
verwenden, um den vorherigen Checkout zu finden. Manchmal ist es ein guter Zustand, in den Sie zurückkehren möchten.
Konkret
$ git reflog
$ git reset --hard [email protected]{0}
Wenn Sie es noch nicht festgelegt haben, können Sie es nur verwenden
$ git checkout -f
Die Zusammenführung wird rückgängig gemacht (und alles, was Sie getan haben).
Zu dieser Frage wurde auch geraten, um wieder mit Origin übereinzustimmen. Nachforschungen fanden heraus, dass es einen reset
-Befehl für genau das gibt:
git reset --hard @{u}
Hinweis: @{u}
ist eine Abkürzung für Origin/master
. (Und natürlich benötigen Sie das entfernte Repository, damit dies funktioniert.)
Für eine zusätzliche Option habe ich mich hauptsächlich an das hier beschriebene Verzweigungsmodell gehalten: http://nvie.com/posts/a-successful-git-branching-model/ und als solches normalerweise mit --no-ff
(kein schneller Vorlauf).
Ich habe gerade diese Seite gelesen, da ich versehentlich einen Testzweig anstelle von meinem Releasezweig mit Master für die Bereitstellung zusammengeführt hatte (Website, Master ist, was live ist). Der Testbranche sind zwei weitere Filialen zugeordnet, die sich aus sechs Commits zusammensetzen.
Um das ganze Commit rückgängig zu machen, brauchte ich nur einen git reset --hard HEAD^
und es wurde die gesamte Zusammenführung 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".
Sie können nur zwei Befehle verwenden, um eine Zusammenführung rückgängig zu machen oder mit einem bestimmten Commit neu zu starten:
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 Master-Zweigs an Origin/Master)Viel Glück und los!
Die einfachste Antwort ist die von odinho - Velmont gegebene
Zuerst git reset --merge ORIG_HEAD
Für diejenigen, die nach dem Drücken von Änderungen zurücksetzen möchten, führen Sie Folgendes aus.
git Push Origin HEAD --force
Dies wird so zurückgesetzt, dass Sie die zusammengeführten Änderungen nach dem Ziehen nicht wieder erhalten.
Wenn Ihre Zusammenführung und die entsprechenden Commits noch nicht gepusht wurden, können Sie jederzeit zu einem anderen Zweig wechseln, den ursprünglichen löschen und neu erstellen.
Ich habe zum Beispiel aus Versehen einen Entwicklungszweig mit einem 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 Meister befindet sich in derselben Phase wie Origin, und Ihr falsch verschmolzener Zustand wird gelöscht.
Ich konnte dieses Problem mit einem einzigen Befehl lösen, bei dem nicht nach einer Festschreibungs-ID gesucht wird.
git reset --hard remotes/Origin/HEAD
Die akzeptierte Antwort funktionierte nicht für mich, aber mit diesem Befehl wurden die gewünschten Ergebnisse erzielt.
Wenn Sie eine Befehlszeilenlösung wünschen, schlage ich vor, die Antwort von MBO zu verwenden.
Wenn Sie ein Neuling sind, könnte Ihnen der grafische Ansatz gefallen:
gitk
(von der Befehlszeile aus, oder klicken Sie mit der rechten Maustaste in den Dateibrowser, wenn Sie das haben).Strategie: Erstellen Sie einen neuen Zweig, von dem aus alles gut war.
Begründung: Das Wiederherstellen einer Verschmelzung ist schwierig. Es gibt zu viele Lösungen, abhängig von vielen Faktoren, z. B. ob Sie die Zusammenführung festgelegt oder gepusht haben oder ob seit der Zusammenführung neue Verpflichtungen eingegangen sind. Sie müssen auch ein relativ tiefes Verständnis von git haben, um diese Lösungen an Ihren Fall anzupassen. Wenn Sie ein paar Anweisungen blind befolgen, erhalten Sie möglicherweise eine "leere Zusammenführung", bei der nichts zusammengeführt wird. Bei weiteren Zusammenführungsversuchen wird Git Ihnen "Bereits auf dem neuesten Stand" mitteilen.
Lösung:
Angenommen, Sie möchten dev
in feature-1
zusammenführen.
Suchen Sie die Revision, die Sie für 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
Schau es dir an (geh zurück in der Zeit):
git checkout e5f6g7h8
Erstellen Sie dort eine neue Niederlassung und checken Sie sie aus:
git checkout -b feature-1
Jetzt können Sie die Zusammenführung erneut starten:
Zusammenführen: git merge dev
Korrigieren Sie Ihre Zusammenführungskonflikte.
Commit: git commit
Wenn Sie mit den Ergebnissen zufrieden sind, löschen Sie den alten Zweig: git branch --delete feature-1
Du musst deinen KOPF ändern, natürlich nicht deinen, aber git HEAD ....
Lassen Sie uns vor der Beantwortung einige Hintergrundinformationen hinzufügen und erklären, was dies ist HEAD
.
First of all what is HEAD?
HEAD
ist lediglich ein Verweis auf das aktuelle Commit (spätestens) für den aktuellen Zweig.
Es kann immer nur ein einziges HEAD
geben. (außer _git worktree
_)
Der Inhalt von HEAD
ist in _.git/HEAD
_ gespeichert und enthält die 40 Bytes SHA-1 des aktuellen Commits.
detached HEAD
Wenn Sie sich nicht auf dem neuesten Commit befinden - was bedeutet, dass HEAD
auf ein vorheriges Commit in der Geschichte verweist, heißt es detached HEAD
.
In der Befehlszeile sieht es wie folgt aus: SHA-1 anstelle des Zweignamens, da HEAD
nicht auf die Spitze des aktuellen Zweigs zeigt
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 eine Verzweigung erstellen und von diesem Punkt an 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 auch immer reflog
verwenden.
_git reflog
_ zeigt jede Änderung an, die das HEAD
aktualisiert hat, und das Auschecken des gewünschten Reflog-Eintrags setzt das HEAD
auf diesen Commit zurück.
Jedes Mal, wenn das HEAD geändert wird, wird ein neuer Eintrag im reflog
_git reflog
git checkout [email protected]{...}
_
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset --hard <commit_id>
"Verschieben" Sie Ihr 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.
_
git rebase --no-autostash
_ verwenden.git revert <sha-1>
"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Reset-Befehl macht alle Änderungen "rückgängig", die an dem angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit auch 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 macht.
Wie Sie dort sehen können, _reset && checkout
_ modifizieren Sie das HEAD
.
Wenn Sie sich gerade in einer Zusammenführung befinden, können Sie es jederzeit abbrechen git merge --abort
Ich denke, Sie können git rebase -i [hash] [branch_name]
tun, wobei [hash]
der identifizierende Hash ist, für den Sie jedoch weit zurückspulen möchten (oder wie viele Commits Sie zurücklegen möchten) und dann die Zeilen für die Commits im Editor löschen, die Sie nicht möchten nicht mehr. Speicher die Datei. Ausgang. Beten. Und es sollte zurückgespult werden. Möglicherweise müssen Sie einen git reset --hard
ausführen, aber es sollte an dieser Stelle gut sein. Sie können dies auch verwenden, um bestimmte Commits aus einem Stack zu ziehen, wenn Sie sie nicht in Ihrem Verlauf behalten möchten. Dies kann jedoch dazu führen, dass Ihr Repository in einem Zustand bleibt, den Sie wahrscheinlich nicht möchten.
Wenn Sie die Zusammenlegung begangen haben:
git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
Stellen Sie zunächst sicher, dass Sie alles festgelegt haben.
Setzen Sie dann Ihr Repository auf den vorherigen Arbeitszustand zurück:
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
oder --hard
verwenden ( dadurch werden alle lokalen, nicht festgeschriebenen Änderungen entfernt! ):
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
Verwenden Sie den Hash, der vor Ihrem falsch zusammengeführten Commit vorhanden war.
Überprüfen Sie anhand der folgenden korrekten Version, welche Commits Sie erneut festlegen möchten:
$ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
...
commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
...
Wenden Sie Ihre rechten Festschreibungen oben in der rechten Version Ihres Repositorys an, indem Sie:
Durch die Verwendung von Cherry-Pick (die Änderungen, die durch einige vorhandene Commits vorgenommen wurden)
git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
Oder durch die Auswahl der Commits durch:
Ü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
wenn dies der Bereich der korrekten Commits ist, die Sie festgelegt haben (ausgenommen falsch begangene Zusammenführung).
Dies kann auf verschiedene Arten geschehen.
1) Zusammenführung abbrechen
Wenn Sie sich zwischen einer fehlerhaften Zusammenführung befinden (fälschlicherweise mit einem falschen Zweig ausgeführt) und die Zusammenführung vermeiden möchten, kehren Sie wie folgt zum Zweig zurück:
git merge --abort
2) HEAD auf Remote-Zweig zurücksetzen
Wenn Sie in einem Remote-Entwicklungszweig arbeiten, können Sie HEAD wie folgt auf den letzten Commit für den Remote-Zweig zurücksetzen:
git reset --hard Origin/develop
) Löschen Sie den aktuellen Zweig und checken Sie ihn erneut aus dem Remote-Repository aus
Wenn Sie daran arbeiten, einen Zweig in einem lokalen Repository zu entwickeln, der mit einem 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
Die einfachste der einfachsten Chance, viel einfacher als alles, was hier gesagt wird:
Entfernen Sie Ihren lokalen Zweig (lokal, nicht entfernt) und ziehen Sie ihn erneut. Auf diese Weise machen Sie die Änderungen in Ihrem Hauptzweig rückgängig, und alle werden von der Änderung betroffen sein, die Sie nicht verschieben möchten. Beginnen Sie es noch einmal.
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Das hat bei mir geklappt .. !!
Erstellen Sie einfach einen neuen Zweig und wählen Sie dann die gewünschten Commits aus.
Es spart und vereinfacht das Zurücksetzen, wie oben in vielen Antworten beschrieben
In diesem Fall sollten Sie Ihren Zweig mit git reset --hard <branch_name>
zurücksetzen. Wenn Sie Ihre Änderungen vor dem Zurücksetzen speichern möchten, müssen Sie unbedingt einen neuen Zweig und git checkout <branch_name>
erstellen.
Sie können den Status auch mit git reset --hard <commit_id>
auf ein bestimmtes Commit zurücksetzen.
Wenn die Änderungen gepusht wurden, können Sie stattdessen git revert <branch_name>
verwenden. Informieren Sie sich auch in anderen Szenarien über die Verwendung von git revert und git checkout .
Wenn Sie feststellen, dass Sie unmittelbar nach der Zusammenführung wiederherstellen müssen und Sie nach dem Zusammenführungsversuch keine weiteren Aktionen ausgeführt haben, können Sie einfach den folgenden Befehl ausgeben: git reset --hard [email protected]{1}
.
Im Wesentlichen zeigt Ihre Zusammenführung sha
auf [email protected]{0}
, wenn nach der Zusammenführung nichts anderes festgelegt wurde, und [email protected]{1}
der vorherige Punkt vor der Zusammenführung ist.