Sie können git rebase --interactive
D vor B ausführen und neu anordnen und D in A quetschen.
Git öffnet einen Editor und Sie sehen eine Datei wie diese, z. git rebase --interactive HEAD~4
pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D
# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Jetzt ändern Sie die Datei so, dass sie so aussieht:
pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C
Und git wird nun die Änderungen von A und D zu einem Commit zusammenführen und anschließend B und C setzen. Wenn Sie die Festschreibungsnachricht von D nicht beibehalten möchten squash
, verwenden Sie stattdessen das fixup
Schlüsselwort. Weitere Informationenfixup
finden Sie in den git rebase
Dokumenten oder in dieser Frage, die einige gute Antworten enthält.
There is no tracking information for the current branch
beim erneuten Basieren eine Fehlermeldung angezeigt. In diesem Fall müssen Sie die Anzahl der Commits angeben, mit denen Sie arbeiten möchtengit rebase -i HEAD~4
. Siehe diese Antwort .Hinweis: Sie sollten Commits, die auf ein anderes Repo verschoben wurden, in keiner Weise ändern, es sei denn, Sie kennen die Konsequenzen .
git log --oneline -4
git rebase --interactive
Typ
i
(VIM in den Einfügemodus versetzen)Ändern Sie die Liste so, dass sie so aussieht (Sie müssen die Festschreibungsnachricht nicht entfernen oder einschließen). Nicht falsch schreiben
squash
! ::Geben Sie Escdann
ZZ
(Speichern und Beenden von VIM) ein.Art
i
Ändern Sie den Text so, wie die neue Festschreibungsnachricht aussehen soll. Ich empfehle eine Beschreibung der Änderungen im Commit
A
undD
:Geben Sie Escdann ein
ZZ
git log --oneline -4
git show E
Sie haben jetzt ein neues Commit erstellt
E
. CommitsA
undD
sind nicht mehr in Ihrer Geschichte, aber nicht weg. Sie können sie zu diesem Zeitpunkt noch für eine Weile wiederherstellengit rebase --hard D
(git rebase --hard
zerstört alle lokalen Änderungen! ).quelle
Für diejenigen, die SourceTree verwenden :
Stellen Sie sicher, dass Sie die Commits noch nicht verschoben haben.
Squash with previous
quelle
Die interaktive Rebase funktioniert gut, bis Sie einen großen Feature-Zweig mit 20 bis 30 Commits und / oder einigen Zusammenführungen von Master- oder / und Konfliktbehebungen haben, während Sie in Ihrem Zweig Commits durchgeführt haben. Auch mit meinen Commits durch die Geschichte Suchen und Ersetzen
pick
mitsquash
nicht hier gearbeitet. Also suchte ich nach einem anderen Weg und fand diesen Artikel . Ich habe meine Änderungen vorgenommen, um dies in einem separaten Zweig zu tun:Vorher habe ich meine Pull-Anfrage mit ca. 30 Commits mit 2-3 Zusammenführungen von Master + Fixing-Konflikten erhalten. Und danach bekam ich klare PR mit einem Commit.
PS hier ist Bash- Skript , um diese Schritte im Automode auszuführen.
quelle
$ git checkout master
$ git log --oneline
$ git rebase --onto HEAD ^^^ HEAD ^
$ git log --oneline
quelle
--oneline
? Und es sieht so aus, als wären Sie gefallenC
undB
das ist nicht die Absicht des OP.git show A
) zusammengeführt, und D, C und B gingen in meinem Ref-Log verloren. Musstegit rebase D
zurück.