Ich möchte mehrere Commits in der Mitte eines Zweiges zusammenfassen, ohne die Commits davor und danach zu ändern.
Ich habe:
%Vor%Ich möchte das in
zerquetschen %Vor% Dabei steht H
für B -- C -- D
. Und ich möchte die Commit-Nachricht von H
angeben können. A
ist der letzte Commit, der übertragen wurde, so dass alle Commits danach neu geschrieben werden können, ohne den Server zu stören. Die Idee ist, den Verlauf zu bereinigen, bevor ich master
vorschnelle.
Wie kann ich das tun?
PS: Beachten Sie, dass ich in meinem Fall tatsächlich mehr als 3 Commits in der Mitte habe, aber wenn ich es mit 3 machen kann, sollte ich es mit mehr machen können.
PPS: Wenn möglich, würde ich auch eine Lösung bevorzugen, bei der E
, F
und G
unberührt bleiben (hauptsächlich bezüglich des Commit-Datums).
Sie können eine interaktive Rebase erstellen und die Commits auswählen, die Sie zerquetschen möchten. Dadurch wird der Verlauf Ihres dev
-Verzweigs neu geschrieben, aber da Sie diese Commits nicht gepusht haben, sollte es keine negativen Auswirkungen darauf geben, außer was auf Ihrem eigenen Computer passieren könnte.
Beginnen Sie mit dem Folgenden:
%Vor% Dies sollte ein Fenster öffnen, das Ihnen die folgende Liste von 7 Commits zeigt, die 6 Schritte vom HEAD Ihres dev
Branches zurückgehen:
Der erste gezeigte Commit ( A
oben) ist der älteste und der letzte ist der letzte. Sie können sehen, dass die Option für jedes Commit standardmäßig pick
ist. Wenn Sie jetzt die Rebase abgeschlossen haben, würden Sie jedes Commit beibehalten, wie es ist, was effektiv ein No-Op ist. Aber da Sie bestimmte mittlere Commits quetschen möchten, bearbeiten und ändern Sie die Liste wie folgt:
Beachten Sie sorgfältig, was oben passiert. Wenn Sie squash
eingeben, sagen Sie Git, das commit in das eine oberhalb zu übernehmen, was das Commit ist, das unmittelbar vor kam. Das heißt also, commit D
rückwärts in commit C
zu quetschen und dann C
in B
zu quetschen, so dass Sie nur ein Commit für die Commits B
, C
und D
erhalten. Die anderen Commits bleiben so wie sie sind.
Speichern Sie die Datei (: wq auf Git Bash in Windows), und der Rebase ist abgeschlossen. Denken Sie daran, dass Sie daraus Mischkonflikte erhalten können, wie Sie vielleicht erwarten, aber es gibt nichts Besonderes, sie zu lösen, und Sie können so weitermachen wie bei jeder normalen Rebase oder Zusammenführung.
Wenn Sie den Zweig nach der Rebase untersuchen, werden Sie feststellen, dass die Commits E
, F
und G
jetzt neue Hashes, Datumsangaben usw. haben. Dies liegt daran, dass diese Commits tatsächlich durch neue ersetzt wurden verpflichtet. Der Grund dafür ist, dass Sie die Geschichte umgeschrieben haben, und deshalb können die Commits im Allgemeinen nicht mehr so sein wie zuvor.
Tags und Links git git-squash