Angenommen, ich habe das folgende Szenario:
%Vor%Gibt es einen Git-Befehl, der einen neuen Zweig erstellt, so dass er den Teilbaum nach Zweig X enthält? Ich möchte eine "große Rebase" durchführen, ich möchte, dass die drei WIP-Filialen auf Master referenziert werden.
Ich weiß, dass ich das mit einigen Bash-Skripten machen kann, aber ich würde gerne wissen, wie man das mit einem Git-Befehl macht.
Es gibt keinen einzigen Git-Befehl dafür. Sie müssen einige manuelle Arbeit erledigen. In Ihrer Situation:
%Vor%Sie setzen zuerst WIP1 auf Master:
%Vor%was zu diesem führen wird:
%Vor% Wenn Sie jetzt git rebase --onto master X WIP2
ausführen, erhalten Sie diese Struktur:
Dies ist wahrscheinlich nicht das, was Sie wollen, also sollten Sie jetzt WIP2 und WIP3 auf B’
:
was zu diesem führen wird:
%Vor% Dies sollte ein rebase --onto
sein (Sie können ein Beispiel in " Wie verschiebt man bestimmte Commits in einen anderen Zweig in git? "):
Aus Chronial s test , das würde geben:
%Vor%Also ist die erste Rebase in Ordnung, aber du musst Y SHA bekommen, und:
%Vor%Ich habe diese Frage als doppelt gekennzeichnet. Ich werde schreiben, was ich erklärt habe die andere Antwort , aber mit Ihrem Beispiel.
Der Ansatz, den ich für solche Anwendungsfälle verwende, besteht darin, alle Zweige zusammenzuführen
in einen gemeinsamen künstlichen -Knoten verschoben werden und dann den Rebase-Befehl verwenden
mit der Option --preserve-merges
. Wenn Sie alle Zweige zusammenführen, wird 1 angezeigt
Endpunkt , der als letzter Eingabeparameter für rebase --onto
verwendet wird. Das
Startpunkt ist in der Regel offensichtlich, der Ursprung des Teilbaums zu verschieben.
Beim Zusammenführen zum Teilbaumendpunkt sollten Konflikte explizit angegeben werden
vermieden werden. Daher müssen die Zusammenführungsbefehle angewiesen werden, sie zu lösen
automatisch mit der Option -Xours
. Das Zusammenführungsergebnis ist nicht wichtig
da diese künstlichen Merge-Knoten nach der Rebase verworfen werden.
Es wird empfohlen, einen neuen Zweig pack zu erstellen, um die Originalreferenzen. Im obigen Beispiel wären die folgenden Befehle durchgeführt:
%Vor%Unten kann man sehen, was der Baum werden würde. Zwei neue künstliche Knoten p2 und pack wurden mit den Zusammenführungen erstellt.
%Vor%Jetzt ist es Zeit für eine Rebase. Seit jetzt gibt es einen gemeinsamen Endpunkt für alle Zweige ( pack ), ist es einfach, den gesamten Teilbaum mit:
zu verschieben %Vor%Was das bewirkt:
%Vor%Jetzt ist es an der Zeit, die Referenzen neu anzuordnen. Ich weiß nicht warum, in einigen Fälle werden die Referenzen verschoben und in anderen nicht. Geben Sie dies für ein jede Referenz WIP1, WIP2, WIP3 oder was immer Sie brauchen:
%Vor%Und schließlich werden Sie die künstlichen Commits loswerden, für die sie erstellt wurden Erzeugen eines gemeinsamen Teilbaum-Endknotens.
%Vor%Also wäre der letzte Baum:
%Vor%Wenn Sie dieses Ergebnis haben möchten
%Vor%Sie sollten das tun:
%Vor%