Angenommen, Sie haben eine Historie mit den drei Commits A, B und C :
A-B-C
Ich möchte die beiden Commits A und B zu einem Commit AB kombinieren :
AB-C
Ich habe es versucht
git rebase -i A
Das öffnet meinen Editor mit folgenden Inhalten:
pick e97a17b B
pick asd314f C
Ich ändere das auf
squash e97a17b B
pick asd314f C
Dann sagt Git 1.6.0.4:
Cannot 'squash' without a previous commit
Gibt es einen Weg oder ist das einfach unmöglich?
git
rebase
git-rebase
git-rewrite-history
Christian
quelle
quelle
Antworten:
Verwendung
git rebase -i --root
ab Git Version 1.7.12 .Ändern Sie in der interaktiven Rebase-Datei die zweite Zeile von Commit B in Squash und lassen Sie die anderen Zeilen bei Auswahl :
Dadurch werden die beiden Commits A und B zu einem Commit AB kombiniert .
Gefunden in dieser Antwort .
quelle
Du versuchtest:
Es ist möglich, so zu beginnen, wenn Sie fortfahren
edit
anstattsquash
:dann renne
Getan.
quelle
git rebase --abort
von vorne anfangen und es richtig machen (nicht das erste Commit im Editor quetschen)A
war das anfängliche Festschreiben, aber jetzt möchten SieB
das anfängliche Festschreiben sein. Git-Commits sind ganze Bäume, keine Unterschiede, selbst wenn sie normalerweise anhand des von ihnen eingeführten Unterschieds beschrieben und betrachtet werden.Dieses Rezept funktioniert auch dann, wenn zwischen A und B sowie zwischen B und C mehrere Commits bestehen.
quelle
git rebase --onto tmp <sha1_for_B>
Im Fall einer interaktiven Rebase müssen Sie dies vor A tun, damit die Liste wie folgt lautet:
werden:
Wenn A das anfängliche Commit ist, müssen Sie ein anderes anfängliches Commit haben, bevor A. Git an Unterschiede denkt. Es wird den Unterschied zwischen (A und B) und (B und C) bearbeiten. Daher funktioniert der Kürbis in Ihrem Beispiel nicht.
quelle
Für den Fall, dass Sie Hunderte oder Tausende von Commits haben, verwenden Sie die Antwort von kostmo von
Dies kann unpraktisch und langsam sein, nur aufgrund der großen Anzahl von Commits, die das Rebase-Skript zweimal verarbeiten muss , einmal, um die interaktive Rebase-Editorliste zu erstellen (in der Sie auswählen, welche Aktion für jedes Commit ausgeführt werden soll) und einmal, um das Commit tatsächlich auszuführen erneute Anwendung von Commits.
Hier ist eine alternative Lösung , mit der Sie die Zeitkosten für die Erstellung der Liste der interaktiven Rebase-Editoren vermeiden können, indem Sie überhaupt keine interaktive Rebase verwenden . Auf diese Weise ähnelt es der Lösung von Charles Bailey . Sie erstellen einfach einen verwaisten Zweig aus dem zweiten Commit und setzen dann alle darüber liegenden Commits neu fest:
Dokumentation
quelle
In einer verwandten Frage gelang es mir, einen anderen Ansatz für die Notwendigkeit zu finden, gegen das erste Commit zu quetschen, nämlich es zum zweiten zu machen.
Wenn Sie interessiert sind: git: Wie füge ich ein Commit als erstes ein und verschiebe alle anderen?
quelle
Git-Befehl für Squad: Git Rebase -i HEAD ~ [Anzahl der Commits]
Nehmen wir an, Sie haben unten einen Git-Commit-Verlauf:
pick 5152061 feat: Unterstützung für das Speichern von Bildern hinzugefügt. (A)
Wählen Sie 39c5a04 Fix: Fehlerbehebungen. (B)
839c6b3 Fix auswählen: Konflikt gelöst. (C)
Nun möchten Sie A und B zu AB quetschen. Führen Sie die folgenden Schritte aus:
pick 5152061 feat: Unterstützung für das Speichern von Bildern hinzugefügt. (A)
s 39c5a04 Fix: Fehlerbehebungen. (B)
839c6b3 Fix auswählen: Konflikt gelöst. (C)
Hinweis: Für das Squashing-Commit können wir Squash oder s verwenden. Das Endergebnis ist:
pick 5152061 feat: Unterstützung für das Speichern von Bildern hinzugefügt. (AB)
Auswahl 839c6b3 Fix: Konflikt gelöst. (C)
quelle
Sie müssen ein bisschen Befehlszeilenmagie ausführen.
Damit sollten Sie einen Zweig haben, der AB und C als Commits hat.
quelle