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?
quelle
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?--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?Antworten:
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, undgit 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:
In diesem Fall hätten Sie wahrscheinlich Folgendes verwenden sollen
rebase --onto
:Das hätte Ihnen eine Grafik hinterlassen, die so aussah:
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 --abort
die 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.
quelle
git reset --hard xxxxx
rettete mich! Ich dachte alles wäre verloren! Auchgit reset xxxx
ohne das--hard
hat nicht funktioniert!git rebase
(gegen den Upstream) alle lokalen Commits verliert und nur den Kopf auf den Upstream setzt. Während agit rebase -i
ohne Änderungen (alles ist ausgewählt) richtig funktioniert. Ich denke ehrlich, es ist eine Art obskurer Fehler.