Habe ich meine Änderungen nach dem erneuten Basieren verloren?

80

Ich habe kürzlich einen Zweig neu gegründet, an dem ich gearbeitet habe. Die Geschichte des Baumes sah ungefähr so ​​aus:

1 = 2 = 3 = 4
     \
      5 = 6 = 7
           \
            8

Ich wollte meine Änderungen (Nummer 8 im Diagramm) auf den Hauptzweig zurücksetzen (bis jetzt 4 im Diagramm festschreiben). Also habe ich folgendes gemacht:

git checkout my_branch
git rebase master

<viele git mergetool / git rebase - überspringen, um Konflikte zu lösen>

Erst jetzt, wenn ich renne:

git checkout my_branch
git diff master

Ich bekomme keine Unterschiede. Ich habe meinen Zweig nicht verloren (ich kann meine Änderungen aus einem gespeicherten Patch immer noch neu erstellen), aber ich kann die Zusammenführung / Neuausrichtung, die ich durchgeführt habe, nicht finden. Was habe ich falsch gemacht? Ist die Rebase noch irgendwo da, wo meine Änderungen mit dem Master zusammengeführt wurden, oder muss ich es erneut tun?

Dave
quelle
2
Wenn Sie git rebase --skip(statt --continue) getan haben, ist es möglich, dass Sie eine Änderung "übersprungen" haben, die während der Rebase tatsächlich noch bedeutende Änderungen hatte?
CB Bailey
2
Wenn Sie manuell zusammengeführt haben, möchten Sie normalerweise --continue. Sie müssen nur überspringen, wenn das Ergebnis der Zusammenführung "keine Änderung" ist. Wie viele der Änderungen haben Sie übersprungen und wie viele haben Sie tatsächlich angewendet?
CB Bailey
13
Ich habe eine neue Regel: Keine Umbasierung nach 1 Uhr morgens
ryan0
3
Eine einfache Möglichkeit, Probleme mit einer fehlgeschlagenen Rebase zu vermeiden, besteht darin, vor dem Starten einen Zweig zu erstellen. Sie können das Endergebnis auch einfacher mit dem Original vergleichen. Löschen Sie einfach den Zweig, wenn Sie fertig sind.
jpmc26
2
Dies (https: //) goo.gl/YQUyi1 hat mir Zeit gespart.
InaFK

Antworten:

196

Wenn Sie keinen Unterschied feststellen, haben Sie vermutlich Ihre Änderungen verloren. Sie können wahrscheinlich verwenden git reflog, um den Zweig zu identifizieren, der vor der Rebase vorhanden war, und git reset --hard <my-branch-tip-before-rebase>um den ursprünglichen Zweig zurückzugewinnen. Und ja, Sie müssen den Prozess erneut durchlaufen. :-(

Ich bin mir nicht ganz sicher, wie es dazu kam, dass sie gleich aussahen. Ich hätte erwartet, mit dem Befehl, den Sie gegeben haben, Folgendes zu sehen:

1 = 2 = 3 = 4              (master)
     \       \
      \       5' = 6' = 8' (my_branch)
       \
        5 = 6 = 7

In diesem Fall hätten Sie wahrscheinlich Folgendes verwenden sollen rebase --onto:

git rebase --onto master <commit id for 6> my_branch

Das hätte Ihnen eine Grafik hinterlassen, die so aussah:

1 = 2 = 3 = 4              (master)
     \       \
      \       8'           (my_branch)
       \
        5 = 6 = 7

Um Ihre Änderungen zu verlieren, ist ein wenig Übung im Umgang mit Zusammenführungskonflikten erforderlich, insbesondere wenn Sie ein paar große Blöcke haben, die fast identisch aussehen. Ich greife immer auf den tatsächlichen Unterschied zurück, der durch ein Commit eingeführt wurde, und auf den Versuch, diese Änderung herauszufiltern und sie auf angemessene Weise mit dem zu verbinden, was sich bereits in der Branche befindet. Ich kann leicht sehen, wie Ihre Änderung dort verloren gegangen sein kann.

Eine Sache, an die man sich erinnern sollte. Wenn Sie nicht mit einer Reihe von Zusammenführungskonflikten rechnen - weil Sie nicht der Meinung sind, dass die Quellen ausreichend voneinander abweichen, ist das Sehen eine Warnung, wenn Sie etwas falsch machen. Es ist gut, eine Sicherungskopie zu erstellen, indem Sie git rebase --abortdie Zweige untersuchen und erneut prüfen, ob Sie einen Konflikt erwarten. Stellen Sie sicher, dass Sie sich notieren, wo der Konflikt aufgetreten ist (normalerweise wird ein "Anwenden ..." angezeigt, bevor Rebase Sie zur Befehlszeile führt). Das ist normalerweise ein guter Anfang.

Manchmal sind Konflikte unvermeidbar und mühsam zu lösen. Aber ich vermute, mit etwas Übung werden Sie weniger auf dieses Problem stoßen.

Weitere Informationen zum Transplantieren von Änderungen zwischen Zweigen finden Sie auf der Manpage zu git rebase . Suchen Sie nach "rebase --onto". Der erste Treffer sollte Sie in einem Abschnitt landen, in dem es darum geht, Änderungen in einen anderen Zweig zu übertragen.

John Szakmeister
quelle
22
git reset --hard xxxxxrettete mich! Ich dachte alles wäre verloren! Auch git reset xxxxohne das --hardhat nicht funktioniert!
Chloe
17
Reflog ist ein Gewinner
Bronumski
32
Dies ist ein Lebensretter.
Wes Rice
7
Ich habe etwas ähnliches gesehen. Ich habe es in einem früheren Job gesehen und heute wieder gesehen. Das Repository kann jemanden in einen Zustand versetzen, in dem ein regulärer git rebase(gegen den Upstream) alle lokalen Commits verliert und nur den Kopf auf den Upstream setzt. Während a git rebase -iohne Änderungen (alles ist ausgewählt) richtig funktioniert. Ich denke ehrlich, es ist eine Art obskurer Fehler.
Ryan Lundy
11
OH MEIN GOTT! Du hast mich gerettet! Ich habe einen Reflog und dann einen Cherry-Pick gemacht: D
Fernando Martínez