Setzen Sie eine Zusammenführung zurück, nachdem Sie sie verschoben haben


79

Schritte, die ich ausgeführt habe:

Ich habe zwei Zweige branch1 und branch2,

$git branch --Initial state
$branch1

$git checkout branch2
$git pull origin branch1 --Step1

Ich habe die Konflikte gelöst und a

$git commit -m "Merge resolved"

dann

$git checkout branch1
$git merge branch2
$git push origin branch1

Jetzt wurde mir klar, dass bei Schritt 1 durch das automatische Zusammenführen Code entfernt und der Änderungscode verschoben wurde. Jetzt möchte ich zu meinem Ausgangszustand zurückkehren, um alle Änderungen rückgängig zu machen. Suchen Sie nach sofortiger Hilfe?


Macht git revert nicht das, was du willst?
Frederick Cheung

1
Es wird die folgende Meldung angezeigt: fatal: Commit b4a758b36a5bde9311061fe7b56e4f47859de052 ist eine Zusammenführung, es wurde jedoch keine Option -m angegeben. @ FrederickCheung
Bijendra

Lesen Sie das Handbuch zur Option -m. kernel.org/pub/software/scm/git/docs/git-revert.html In Kürze können Sie -m 1 oder -m 2 verwenden. Hiermit wird ausgewählt, auf welche von zwei übergeordneten Revisionen Sie zurücksetzen möchten.
Ilya Ivanov

yaa ich habe git revert -m 1 SHA verwendet, jetzt kommen alle Änderungen als Änderungen, die in meinem lokalen
festgeschrieben werden sollen

Es gab einen Fehler in vim, der es während des Wiederherstellungsvorgangs beendete. Ich habe git config --global core.editor / usr / bin / vim ausgeführt und das Problem behoben. Anschließend wurde das Zurücksetzen erfolgreich ausgeführt, um das Problem zu beheben. Danke
Bijendra

Antworten:


94

Sie können die Zusammenführung gemäß der offiziellen Anleitung zurücksetzen. Dies lässt Git jedoch fälschlicherweise glauben, dass sich die zusammengeführten Commits noch im Zielzweig befinden.

Grundsätzlich muss man:

git revert -m 1 (Commit id of the merge commit)

26
Man sollte vorsichtig mit dem sein 1. Dies bedeutet, dass das firstübergeordnete Element der Zusammenführung festgeschrieben wird. Wenn man jedoch (hypothetisch) "versehentlich" den Master mit dem Zweig zusammenführt, dann spult man den Master schnell zum zusammengeführten Commit vor - sollte man verwenden -m 2, um die Zusammenführung auf dem Master zurückzusetzen.
Krzysztof Jabłoński

1
Sei vorsichtig damit 1. Es hat mein Repository durcheinander gebracht, indem die Zusammenführung teilweise zurückgesetzt wurde, während ich die Zusammenführung vollständig zurücksetzen wollte. Am Ende habe ich den Revert zurückgesetzt!
Javad Sadeqzadeh

1
@JavadSadeqzadeh oder, Sie haben Ihr Repository durch Kopieren von SO durcheinander gebracht, ohne vollständig zu überprüfen, was die Antwort bewirkt
Joel

32

Versuchen Sie git reflog <branch>, herauszufinden, wo sich Ihr Zweig vor dem Zusammenführen befand, und git reset --hard <commit number>die alte Revision wiederherzustellen.

Reflog zeigt Ihnen ältere Zustände des Zweigs an, sodass Sie ihn auf einen beliebigen Änderungssatz zurücksetzen können.

Stellen Sie sicher, dass Sie sich in der richtigen Verzweigung befinden, wenn Sie git reset verwenden

Sie können dies tun git push -f, um den Verlauf des Remote-Repositorys zu ändern. Dies wird jedoch nicht empfohlen, da bereits jemand von Ihnen gepuschte Änderungen heruntergeladen haben kann.


1
Ich hatte den Code in den Remote-Zweig
verschoben

3
Wenn Sie bereits gepusht haben, möchten Sie NICHT die lokale Geschichte neu schreiben, wie Ilya beschrieben hat
ms-tg

2
Entschuldigung, ich habe das Ding verpasst ... Manchmal können Sie git push -f verwenden, um den Remote-Verlauf neu zu schreiben. Dies hängt von Ihrer Remote-Repository-Konfiguration und anderen Teammitgliedern ab (wenn sie Sie nicht für diesen erzwungenen Push töten).
Ilya Ivanov

8

Die erste Option ist die Verwendung von git revert.

git revert -m 1 [sha-commit-before-merge]

Das git revertwird die Änderungen zurücksetzen, aber den Verlauf beibehalten. Daher können Sie nicht mehr in demselben Zweig weiterarbeiten, da Sie den tatsächlichen Unterschied zwischen dem zusammengeführten Zweig und Ihrem Feature-Zweig nicht mehr sehen können. Verwenden Sie die folgende Methode, um auch den Verlauf zu entfernen. Tun Sie dies sehr vorsichtig, wenn und nur wenn Sie der einzige sind, der im Moment Änderungen am Zweig vorantreibt.

git reset --hard [sha-commit-before-merge]
git push [origin] [branch] --force

1

In meinem Fall habe ich meinen Zweig (z. B. meinen Zweig) mit einem anderen Feature-Zweig (Feature-Zweig) zusammengeführt, aber nicht mit dem Master. Meine Branchengeschichte war also so:

my-branch (before merge)

---master----m1----m2----m3---m4

Nach dem Zusammenführen mit einem anderen, feature-branchder Commits f1, f2über dem Master hatte, wurde es so:

my-branch (after merge)

---master----m1----m2----f1----f2----m3---m4----mergecommit

Dies ist möglicherweise passiert, weil ich während der Arbeit an meinem Zweig nach zwei Festschreibungen eine Zusammenführung vom Master durchgeführt habe oder einer von zwei Zweigen möglicherweise nicht mit dem Master auf dem neuesten Stand war. In diesem Fall git revert -m 1funktionierte es also nicht, da es diese verließ f1und f2dazwischen festschrieb.

Die Lösung war einfach und funktioniert in normalen Szenarien, in denen wir keine Zwischen-Commits haben:

git rebase -i HEAD~6

Verwenden Sie anstelle von 6 die entsprechende Nummer, basierend auf der Anzahl der Commits in der Vergangenheit, die Sie ändern möchten. Jetzt wird der Vim-Editor geöffnet. Markieren Sie einfach unerwünschte Commits als dropgleich und beenden Sie das :wq Programm mit dem Überprüfungsprotokoll:

git log --oneline 

Kraft drücken

git push -f

Jetzt sollte sich der Remote-Zweig im vorherigen Status befinden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.