Ich habe "git rebase --continue" vergessen und "git commit" gemacht. Wie repariert man?

112

Ich habe Code in Git neu basiert und einige Zusammenführungskonflikte festgestellt. Ich habe die Konflikte gelöst und Folgendes getan:

git add

Zu diesem Zeitpunkt habe ich vergessen zu tun:

git rebase --continue

Ich fuhr mit dem Codieren fort und tat:

git commit

für die Änderungen. Jetzt bin ich dran "no branch"und kann nicht:

git rebase --continue 

Wie behebe ich das?

Abhilash
quelle
# Derzeit nicht in einer Filiale. nichts zu begehen (Arbeitsverzeichnis sauber)
Abhilash

Antworten:

5

BEARBEITEN : Sehen Sie sich auch die Antwort unten an, um zu sehen, ob dies eine einfachere Lösung für Sie ist. https://stackoverflow.com/a/12163247/493106


Ich müsste es ausprobieren, aber ich denke, das würde ich tun:

  1. Kennzeichnen Sie Ihr letztes Commit (oder schreiben Sie das SHA1 einfach irgendwo auf, damit Sie es nicht verlieren): git tag temp
  2. git rebase --abort
  3. Führen Sie den Rebase erneut durch. Sie müssen die Zusammenführung erneut auflösen. :((
  4. git rebase --continue
  5. git cherry-pick temp

Das Problem dabei ist, dass Ihr tempCommit wahrscheinlich sowohl die Auflösung der Zusammenführung als auch den neuen Code enthält. Es könnte also schwierig sein, aber ich würde es versuchen und sehen, ob es funktioniert.

MatrixFrog
quelle
Entweder können Sie taggen, wie @MatrixFrog sagt, oder Sie können es auch als Patch speichern. Führen Sie dann den Rebase-Abbruch durch. Überprüfen Sie den Status, um sicherzustellen, dass sich das Repo in einem Zustand befindet, von dem Sie wissen, dass er keine Probleme hatte, und starten Sie dann das Abrufen und Wiederherstellen.
Yasouser
16
Tu das nicht. In der Antwort von kirikaza unten finden Sie eine viel einfachere und sauberere Möglichkeit. Leg dich nicht ein zweites Mal mit Kirschpflücken und der Lösung von Konflikten an.
Tandrewnichols
4
@Abhilash Bitte akzeptiere die Antwort von kirikaza. Ich (wie auch Tandrewnichols) habe dies getan und es gab einen viel einfacheren Weg (und das Internet scheint zuzustimmen, da diese Antwort 4x die positiven Stimmen hat).
David Doria
Es ist jetzt das 10-fache der Upvotes ... Verwenden Sie git rerere, um sich an Ihre Konfliktlösungen zu erinnern (nützlich, es sei denn, Sie treffen manchmal schlechte Lösungen, an die Sie sich nicht erinnern möchten).
Ajax
214

Tu es einfach git reset --soft HEAD^. Der HEAD-Zeiger wird auf das übergeordnete Element verschoben, der Arbeitsbaum bleibt jedoch erhalten, und die Zusammenführungsänderung wird dem Index hinzugefügt. So können Sie wie bisher mit dem Rebasing fortfahren git rebase --continue.

kirikaza
quelle
1
Dies hat völlig funktioniert und war auch das erste Mal, dass ich eine Verwendung für --soft gefunden habe. Schön zu wissen, wie es funktioniert, danke!
mmocny
1
Ich hoffe, die Leute werden alle Stimmen zu dieser Antwort sehen und den hier vorgeschlagenen folgen!
Raghu
1
Dies ist genau das, was ich dachte (aber möglicherweise versehentlich hart vergangen ist). Ich war mir nicht sicher, ob HEAD während einer Rebase aktualisiert wurde. Vielen Dank für die Bestätigung! Ich bin so froh, dass ich ein bisschen weiter gescrollt habe, bevor ich mich mit den Kopfschmerzen oben angelegt habe.
DeezCashews
Ich habe die akzeptierte Antwort bearbeitet, um hier einen Link einzufügen. Ich habe diese Antwort erst gesehen, nachdem ich den obigen Anweisungen gefolgt bin.
Xaxxon
0

Ich hatte das gleiche Problem, und um es noch schlimmer zu machen, habe ich drei Commits neu festgelegt, und nachdem ich Konflikte beim zweiten Festschreiben gelöst hatte, habe ich "festgeschrieben" anstatt "neu festgesetzt - fortzufahren".

Als Ergebnis hatte ich dieses Git Reflog

Als ich die Lösung von kirikaza angewendet habe, habe ich nur das dritte Commit zurückgesetzt und nicht das zweite, was problematisch war.

Wie Sie sehen können, beginnt die Rebase mit einem Checkout aus dem Zweig Remote / Origin / Master und wendet dann meine drei Commits an, die als die drei vorherigen Vorgänge (vor dem Checkout) im Reflog angezeigt werden.

Wenn Sie dann vor dem Rebase von einer sauberen Basis aus neu starten möchten, können Sie kurz vor dem Auschecken des Rebase-Vorgangs einfach hart auf den Hash zurücksetzen. In meinem Fall (siehe Bild):

git reset --hard 859ed3c

Dann können Sie eine neue starten git rebase.

Louis Durand
quelle
0

Ich hatte git neu basiert, Konflikte behoben, git Dateien mit Konflikten hinzugefügt und (fälschlicherweise) festgeschrieben.

Ich habe die git reset --soft HEAD^und git reset --hardLösungen ausprobiert , aber keine hat für mich funktioniert.

Aber es hat einfach git rebase --abortfunktioniert: Es hat mich vor dem Start der Rebase mit einem sauberen Arbeitsbaum zurückgebracht.

Rest
quelle