Warum verwirft Git Rebase meine Commits?

8

Ich versuche einen Ast auf den Master zu bringen, etwas, das ich schon tausend Mal gemacht habe. Aber heute funktioniert es nicht:

%Vor%

Alles beginnt wie normal, aber Git beendet die Rebase, ohne irgendwelche meiner Commits dort zu setzen; Meine Filiale meinst endet auf dem gleichen Commit wie Master.

Die naheliegende Schlussfolgerung wäre, dass meine Commits schon irgendwo im Meister sind. Aber sie sind nicht , ich schwöre es. Ich bin durch die Geschichte gegangen. Die Commits sind in einigen anderen Feature-Zweigen, aber sie sind nirgendwo in der Geschichte von Master. (Und ich kann sagen, dass sie sich sowieso nicht im Master befinden, wenn der Master ausgecheckt ist.)

Also, wenn die Commits nicht bereits in meinem Upstream-Verlauf sind, warum sonst würde git rebase das Stacken meiner Commits an der Spitze verweigern?

Seltsamerweise, wenn ich die Commits auf Master eins nach dem anderen auslese, funktioniert das. Und dann kann ich meinen mystuff-Zweig zum Ende bewegen und wieder dorthin zurückmelden, wo er war. (Aber warum sollte ich es so machen?)

BEARBEITEN :

Die Dokumentation zu git rebase sagt dies:

  

Der aktuelle Zweig wird auf <upstream> oder <newbase> zurückgesetzt, wenn die Option --onto angegeben wurde. Dies hat den gleichen Effekt wie git reset --hard <upstream> (oder <newbase> ). ORIG_HEAD wird vor dem Zurücksetzen auf die Spitze des Zweigs gesetzt.

     

Die Commits, die zuvor im temporären Bereich gespeichert wurden, werden nacheinander nacheinander auf den aktuellen Zweig angewendet. Beachten Sie, dass alle Commits in HEAD , die dieselben textuellen Änderungen wie ein Commit in HEAD..<upstream> einleiten, ausgelassen werden (d. H. Ein Patch, der bereits mit einer anderen Commit-Nachricht oder einem anderen Timestamp upstream akzeptiert wurde, wird übersprungen).

Dies wäre konsistent mit dem Verhalten, das ich sehe wenn die Commits tatsächlich upstream existierten ... aber sie nicht. Und wie in den Kommentaren erwähnt, funktioniert git rebase master korrekt und wendet alle Commits an. Aber git rebase ohne master funktioniert nicht, obwohl Master als der Upstream-Zweig eingestellt ist.

Konfiguration meiner Filialen:

%Vor%     
Ryan Lundy 01.04.2014, 15:49
quelle

2 Antworten

3

Das hat mich nach einem gewissen Git-Upgrade mindestens ein Dutzend Mal gebissen. Dort ist jetzt ein Unterschied zwischen git rebase und git rebase master : Ersteres wurde geändert, um die gleiche "Gabel-Punkt" -Maschinerie zu verwenden. Auf diese Frage gibt es eine ausführliche Erklärung:

Heute habe ich zum ersten Mal konkrete Schritte gefunden, um es zu reproduzieren.

MEIN SZENARIO: Ich habe 4 Commits für master , die ich nun in einen topic Zweig verschieben soll, plus Ich möchte sie neu anordnen. Wenn ich es so mache ...

  1. Erstellen Sie einen neuen Zweig topic , der den aktuellen Zweig verfolgt ( master )

    %Vor%
  2. Zurückspulen master zurück:

    %Vor%
  3. Ordne die Commits für topic

    neu an %Vor%

... dann erscheint auf dem Bildschirm für die interaktive Umbenennung eine ominöse Liste von Commits:

%Vor%

Uh-oh ... Ich speichere die Datei und fahre trotzdem fort. Yup, sieht aus wie Git weggeworfen meine Arbeit wieder. topic zeigt jetzt auf dasselbe Commit wie master und origin/master .

Also ich vermute, was für Sie ausgelöst hat, ist:

  1. Upgrade von git

  2. Sie haben so etwas wie meinen zweiten Schritt in Ihrem master Zweig gemacht.

Nach meinem Laienverständnis durchsucht die fork-point -Maschinerie den Reflog und merkt, dass diese Commits aus dem Upstream-Zweig entfernt wurden, und kommt zu dem Schluss, dass Sie Ihre Zweigstelle "auf den neuesten Stand" bringen sollte auch dort entfernt werden.

Die Lösung ist statt:

%Vor%

Verwenden Sie eine der folgenden Optionen:

%Vor%

Aber ich vermute, ich würde das nicht jedes Mal tun. (Ich meine, wir haben aus einem bestimmten Grund eine Upstream-Zweigstelle eingerichtet, oder?) Damit Sie einfach erkennen, wann diese Katastrophe eintritt, verwenden Sie git reflog und git reset --hard zur Wiederherstellung und dann der obige Befehl.

Trotzdem müssen Sie jetzt vorsichtig sein - ich denke, das ist extrem gefährlich. Ich hatte Zeiten, in denen ich einen großen Zweig reabasiert habe und ein paar Commits von Anfang an lautlos verschwunden waren, und das habe ich seit Tagen nicht bemerkt! Ich bin ziemlich zufrieden damit, git reflog für Disaster Recovery zu verwenden, aber ich bin mir nicht sicher, ob es wirklich alle sind. Ich frage mich, ob Git jetzt zu clever hier ist.

    
Luke Usherwood 30.11.2016 11:02
quelle
0

Führen Sie git branch -vv aus, um Upstream-Zweige zu sehen. Es klingt so, als wäre dein Upstream für mystuff nicht das, was du denkst. Vielleicht hatten Sie einen Bearbeitungsunfall und am Ende mehrere [branch "mystuff"] Einträge in Ihrer Konfiguration?

    
Jack O'Connor 01.08.2014 00:18
quelle

Tags und Links