it-swarm.com.de

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

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?

3349
Matt Huggins

Ü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). 

3709
Marcin Gil

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.

1335
randomguy3

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.

1109
Yuri Geinish

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.)

897

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.

342
Travis Reeder

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.

117
MBO

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.

81
Parris

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.

48
Martin G

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
36
Matt Huggins

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}
21
stephjang

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).

13
Idealmind

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.)

12
leanne

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".

10
Damien Byrne

Sie können nur zwei Befehle verwenden, um eine Zusammenführung rückgängig zu machen oder mit einem bestimmten Commit neu zu starten:

  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 Master-Zweigs an Origin/Master)

Viel Glück und los!

10
Matheus Abreu

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.

8
Harsha

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.

7
Stephan

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.

6
Ralph Ritoch

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:

  1. Starten Sie gitk (von der Befehlszeile aus, oder klicken Sie mit der rechten Maustaste in den Dateibrowser, wenn Sie das haben).
  2. Dort können Sie leicht das Merge-Commit erkennen - den ersten Knoten von oben mit zwei Elternteilen
  3. Folgen Sie dem Link zum ersten/linken übergeordneten Element (demjenigen in Ihrem aktuellen Zweig vor der Zusammenführung, normalerweise rot für mich).
  4. Klicken Sie im ausgewählten Commit mit der rechten Maustaste auf "Zweig hier zurücksetzen", und wählen Sie dort den Hard-Reset aus
4
inger

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.

  1. 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
    
  2. Schau es dir an (geh zurück in der Zeit):

    git checkout e5f6g7h8
    
  3. 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:

  1. Zusammenführen: git merge dev

  2. Korrigieren Sie Ihre Zusammenführungskonflikte.

  3. Commit: git commit

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

4
pyb

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.

enter image description here

In der Befehlszeile sieht es wie folgt aus: SHA-1 anstelle des Zweignamens, da HEAD nicht auf die Spitze des aktuellen Zweigs zeigt

enter image description here

enter image description here

Ein paar Möglichkeiten, wie Sie sich von einem abgetrennten HEAD erholen können:


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

enter image description here


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.
_
  • Anmerkung: ( seit Git 2.7 )
    Sie können auch den _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.

enter image description here

3
CodeWizard

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

2
llioor

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.

1
tychoish

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
1
Dorian
  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 --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.

  3. Überprüfen Sie anhand der folgenden korrekten Version, welche Commits Sie erneut festlegen möchten:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. 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).

1
kenorb

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
1
Anamika

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.

0
Luis
  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 geklappt .. !!

0
Siva Kumar

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

0
devi

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 .

0
Nesha Zoric

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.

0
Dut A.