4264 Stimmen

Rückgängigmachen eines Git-Rebase

Weiß jemand, wie man einen Git-Rebase leicht rückgängig machen kann?

Die einzige Möglichkeit, die mir einfällt, ist, manuell vorzugehen:

  • git checkout die übergeordnete Übergabe an beide Zweige
  • und erstellen Sie von dort aus einen temporären Zweig
  • alle Übertragungen von Hand auswählen
  • den Zweig, in dem ich neu erstellt habe, durch den manuell erstellten Zweig ersetzen

In meiner jetzigen Situation wird das funktionieren, weil ich leicht Commits aus beiden Zweigen erkennen kann (einer war mein Zeug, der andere das Zeug meines Kollegen).

Mein Ansatz erscheint mir jedoch suboptimal und fehleranfällig (nehmen wir an, ich hätte gerade mit 2 meiner eigenen Zweige neu geordnet).

Irgendwelche Ideen?

Klarstellung: Ich spreche von einem Rebase, bei dem eine Reihe von Übertragungen wiedergegeben wurden. Nicht nur einer.

109voto

Damodar P Punkte 705
git reset --hard origin/{branchName}

ist die richtige Lösung, um alle durch rebase vorgenommenen lokalen Änderungen zurückzusetzen.

7 Stimmen

Das ist eine sehr saubere Lösung. Danke für den Beitrag. Ich schiebe immer auf Remote, bevor Sie eine rebase und dieser Beitrag rettete meinen Speck, wie ich ~3 Tage aus Datum w / Master auf einem großen Projekt war. Vielen Dank :)

10 Stimmen

Dies kann zu Problemen führen, wenn es lokale Commits gibt, die nicht gepusht wurden. Seien Sie gewarnt

0 Stimmen

Dies ist nicht hilfreich

78voto

Alex Gontmakher Punkte 1337

Ich setze ein Backup-Tag auf den Zweig, bevor ich eine nicht-triviale Operation durchführe (die meisten Rebases sind trivial, aber ich würde das tun, wenn es irgendwo komplex aussieht).

Die Wiederherstellung ist dann so einfach wie git reset --hard BACKUP .

14 Stimmen

Sie brauchen nicht einmal einen Backup-Zweig zu erstellen, Sie können einfach die branchName@{n} Syntax, hier n ist die n-te vorherige Position des Verzweigungszeigers. Wenn Sie also zum Beispiel die Verzweigung featureA Zweig auf Ihr master Verzweigung, aber das Ergebnis der Umbasierung gefällt Ihnen nicht, dann können Sie einfach git reset --hard featureA@{1} um die Verzweigung wieder genau auf den Stand vor dem Zurücksetzen zurückzusetzen. Sie können mehr über die branch@{n} Syntax bei die offiziellen Git-Dokumente für Revisionen .

37voto

Kris Punkte 18038

Verwendung von reflog hat bei mir nicht funktioniert.

Was bei mir funktionierte, war ähnlich wie beschrieben aquí . Öffnen Sie die Datei in .git/logs/refs, die nach dem Zweig benannt ist, der neu geordnet wurde, und suchen Sie die Zeile, die "rebase finsihed" enthält, etwa so:

5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

Sehen Sie sich die zweite Übergabe in der Zeile an.

git checkout 88552c8f

Als ich mir sicher war, dass dies meine verlorenen Änderungen enthielt, machte ich einen Abzweig und atmete erleichtert auf.

git log
git checkout -b lost_changes

2 Stimmen

Danke Mann, du hast mein Leben gerettet. Für mich hatte ich rebase (finish): gefolgt von 3 Commit-IDs. Die zweite ID war die richtige.

0 Stimmen

Meiner listete 2 Commit-IDs auf und sagte rebase (finish) . Da ich den Commit haben wollte, BEVOR ich rebased habe, habe ich die 2. Commit-ID in der Zeile VOR der Umbasierung (=== die 1. commit id in der Zeile MIT dem Befehl rebase). Dann habe ich den Befehl git reset --hard <commit id> . Viola! Wiederhergestellt, als hätte ich die erneute Datenbankerstellung nie durchgeführt. Die Commit-IDs scheinen das folgende Format zu haben idBeforeCommand idAfterCommand Wer Datum/Uhrzeit Befehl

19voto

Greg Hewgill Punkte 882617

Bei mehreren Commits ist zu beachten, dass jeder Commit auf die gesamte Historie bis zu diesem Commit verweist. Lesen Sie also in Charles' Antwort "der alte Commit" als "der neueste der alten Commits". Wenn Sie zu diesem Commit zurücksetzen, wird die gesamte Historie bis zu diesem Commit wieder angezeigt. Dies sollte das bewirken, was Sie wollen.

18voto

Wenn Sie erfolgreich gegen einen entfernten Zweig rebasiert haben, können Sie nicht git rebase --abort können Sie immer noch einige Tricks anwenden, um Ihre Arbeit zu retten und nicht gezwungen zu sein, sie zu verschieben. Nehmen wir an, Ihr aktueller Zweig, der aus Versehen rebased wurde, heißt your-branch und verfolgt origin/your-branch

  • git branch -m your-branch-rebased # aktuellen Zweig umbenennen
  • git checkout origin/your-branch # Checkout in den letzten Zustand, der dem Ursprung bekannt ist
  • git checkout -b your-branch
  • siehe git log your-branch-rebased vergleichen mit git log your-branch und definieren Sie Commits, die in your-branch
  • git cherry-pick COMMIT_HASH für jede Übertragung in your-branch-rebased
  • Ihre Änderungen pushen. Bitte beachten Sie, dass zwei lokale Zweige mit remote/your-branch und Sie sollten nur auf your-branch

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X