Git in falschen Zweig ziehen

74

Ich selbst und ein anderer Entwickler hatten unsere Arbeit zusammengeführt und in einen Nicht-Master-Zweig namens Toolwork verlagert. Auf diese Weise haben wir den Rest des Teams nicht beeinflusst. Mein Themenzweig hieß DPM-93 und mein Git-Workflow war dieser.

# do some work
git checkout DPM-93
git commit -m "did some work"

# catch up
git checkout toolwork
git pull origin toolwork

# rebase my topic branch
git checkout DPM-93
git rebase toolwork

# merge and push my changes
git checkout toolwork
git merge --no-ff DPM-93
git push origin toolwork

Das hat meistens gut funktioniert, bis ich versehentlich diese Git-Befehle ausgegeben habe

git checkout toolwork
git pull origin master

Zu diesem Zeitpunkt tauchten eine Reihe neuer Dinge in der Zweigwerkzeugarbeit auf, und ich bin mir nicht sicher, wie ich sie beseitigen kann, ohne meinen Arbeitsbereich zu löschen und erneut aus dem Repo zu klonen.

Gibt es eine Möglichkeit, dies vor dem Ziehen an den Staat zurückzugeben?

Milchplus
quelle

Antworten:

102
git reset --hard ORIG_HEAD 

Von der git resetManpage (wenn Sie gerade den Pull gemacht haben):

Machen Sie ein Zusammenführen oder Ziehen rückgängig

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)
  1. Der Versuch, vom Upstream aus zu aktualisieren, führte zu vielen Konflikten. Sie waren gerade nicht bereit, viel Zeit mit dem Zusammenführen zu verbringen, also entscheiden Sie sich, dies später zu tun.
  2. " pull" hat kein Merge-Commit durchgeführt, daher wird " git reset --hard", was ein Synonym für " git reset --hard HEAD" ist, das Chaos aus der Indexdatei und dem Arbeitsbaum entfernt.
  3. Führen Sie einen Themenzweig in den aktuellen Zweig ein, was zu einem schnellen Vorlauf führte.
  4. Sie haben jedoch entschieden, dass der Themenbereich noch nicht für den öffentlichen Verbrauch bereit ist.
    Beim "Ziehen" oder "Zusammenführen" bleibt immer die ursprüngliche Spitze des aktuellen Zweigs erhalten.ORIG_HEAD Wenn Sie sie also stark zurücksetzen, werden Ihre Indexdatei und der Arbeitsbaum wieder in diesen Zustand versetzt und die Spitze des Zweigs auf dieses Commit zurückgesetzt.

Sehen Sie HEADundORIG_HEAD für mehr.

VonC
quelle
Wäre es in Ordnung, git rebase -i ORIG_HEADdie unerwünschten Commits zu löschen, vorausgesetzt, noch hat niemand vom Master gezogen?
Unutbu
@unutbu: Ich glaube, das Endergebnis einer solchen Rebase wäre git resetin diesem Fall ähnlich wie bei a.
VonC
Danke, @VonC. Entschuldigung für die dumme Frage. Irgendwie war mir nicht klar, dass dies git reset --hardnicht nur den Arbeitsbaum und den Index ändert, sondern auch den übergeordneten Zeiger in der DAG entfernt.
Unutbu
82

Setzen Sie den Hauptzweig zurück:

git reset --hard origin/master
HoBa
quelle
11
Ich bin mir nicht sicher, ob dies daran liegt, dass die "richtige" Antwort 2 Jahre alt ist, aber nachdem ich die anderen Vorschläge ohne Glück ausprobiert habe, hat dies für mich funktioniert.
Levi Rosol
5
Dies löste das Problem, das ich hatte, nämlich dass ich in den falschen Zweig gezogen hatte
HorseloverFat
2
Hat für mich gearbeitet. Vielen Dank
Glen
9

Mit können git logSie den SHA-1 der Revision finden, die Sie am Anfang Ihrer toolworkZweigstelle haben möchten , und dann git reset --hard <SHA1>Ihre Arbeitskopie auf diese Revision zurücksetzen.

Sichern Sie zuerst alles! Lesen Sie die Manpage erneut git reset, um sicherzustellen, dass sie das tut, was Sie wollen.

EDIT: Oh ja, ORIG_HEAD sollte das richtige SHA-1 enthalten. Aber überprüfen Sie zuerst.

Cameron Skinner
quelle
Ich habe dich zuerst nicht antworten sehen. git resetist richtig (obwohl ein bisschen gefährlich, wie Sie zu Recht erwähnen). +1
VonC
Bevorzugen Sie diese Antwort, da Sie genauer angeben, auf welches Commit Sie zurückgreifen möchten. In meinem Fall war dies nützlich, da ich einige lokale Commits hatte, bevor ich versehentlich den falschen Zweig gezogen habe, sodass ich keinen Hard-Reset auf ORIG_HEAD durchführen wollte.
Joseph Humfrey
4

Ich habe kürzlich etwas Ähnliches getan und eine einfachere Lösung verwendet, die auf dieser Antwort basiert .

Unter der Annahme , dass der Zustand der toolworkZweig, den Sie wiederherstellen möchten gedrückt wurde , um origin, können Sie einfach tun

git fetch origin
git reset --hard origin/toolwork

In meinem Fall wurde der Wert von ORIG_HEADdurch eine andere Zusammenführung in einem anderen Zweig überschrieben, und dabei musste ich mich nicht um die Suche nach dem richtigen Commit im Protokoll kümmern.

Zelanix
quelle
0

Was für mich funktioniert hat ist einfach

git reset --hard

Ich habe dies aus dem lokalen Repository mit dem unglücklichen Zusammenführen / Ziehen getan:

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2|MERGING)
$ git reset --hard
HEAD is now at 2d5a511 [last commit comment]

Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2)
$
Ssaltman
quelle
0

Sie können diese Zusammenführung mit dem folgenden Befehl abbrechen

git merge --abort

Es wird einfach das versehentliche Ziehen rückgängig machen ...

Abdul Yasin
quelle