Suche…
Bemerkungen
Was ist Quetschen?
Squashing ist der Prozess, bei dem mehrere Commits in einem einzigen Commit zusammengefasst werden, der alle Änderungen der ursprünglichen Commits umfasst.
Quetschen und entfernte Äste
Seien Sie besonders vorsichtig, wenn Sie Commits in einem Zweig komprimieren, der einen entfernten Zweig verfolgt. Wenn Sie ein Commit, das bereits an einen entfernten Zweig gepusht wurde, quetschen, werden die beiden Äste auseinandergeführt, und Sie müssen git push -f
, um diese Änderungen auf den entfernten Zweig zu erzwingen. Beachten Sie, dass dies zu Problemen für andere Benutzer führen kann, die diesen entfernten Zweig verfolgen. Aus diesem Grund ist Vorsicht geboten, wenn erzwungene Commits in öffentlichen oder gemeinsam genutzten Repositories erzwungen werden.
Wenn das Projekt auf GitHub gehostet wird, können Sie den "Push-Push-Schutz erzwingen" für einige Zweige wie den master
aktivieren, indem Sie es zu Settings
- Branches
- Protected Branches
hinzufügen.
Letzte Commits für Squash ohne erneute Wiederherstellung
Wenn Sie die vorherigen x
Commits zu einem einzigen komprimieren möchten, können Sie die folgenden Befehle verwenden:
git reset --soft HEAD~x
git commit
Ersetzen Sie x
durch die Anzahl der vorherigen Commits, die in das komprimierte Commit aufgenommen werden sollen.
Beachten Sie, dass dadurch ein neues Commit erstellt wird, das im Wesentlichen die Informationen zu den vorherigen x
Commits (einschließlich Autor, Nachricht und Datum) vergisst. Sie möchten wahrscheinlich zuerst eine vorhandene Bestätigungsnachricht kopieren und einfügen.
Quetsch-Commits während einer Rebase
Commits können während einer git rebase
gestaucht werden. Es wird empfohlen, dass Sie die Umbasierung verstehen, bevor Sie versuchen, Commits auf diese Weise zu quetschen .
Stellen Sie fest, von welchem Commit Sie zurückgestoßen werden möchten, und notieren Sie den Commit-Hash.
Führen Sie
git rebase -i [commit hash]
.Alternativ können Sie
HEAD~4
anstelle eines Commit-Hashes eingeben, um das letzte Commit und 4 weitere Commits vor dem letzten anzuzeigen.Bestimmen Sie im Editor, der beim Ausführen dieses Befehls geöffnet wird, welche Commits Sie quetschen möchten. Ersetzen Sie
pick
am Anfang dieser Zeilen durchsquash
um sie beim vorherigen Commit zu quetschen.Nachdem Sie die Commits ausgewählt haben, die Sie quetschen möchten, werden Sie aufgefordert, eine Commit-Nachricht zu schreiben.
Logging-Commits, um zu bestimmen, wo die Datenbank neu erstellt werden soll
> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
> git rebase -i 36d15de
An dieser Stelle wird der Editor Ihrer Wahl angezeigt, in dem Sie beschreiben können, was Sie mit den Commits machen möchten. Git bietet Hilfe in den Kommentaren. Wenn Sie es so belassen, wie es ist, wird nichts passieren, da jedes Commit beibehalten wird und seine Reihenfolge dieselbe ist wie vor der Rebase. In diesem Beispiel wenden wir die folgenden Befehle an:
pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed
# Rebase 36d15de..612f2f7 onto 36d15de (3 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
Git-Protokoll nach dem Schreiben der Commit-Nachricht
> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
Autosquash: Commit-Code, den Sie während einer Rebase quetschen möchten
Stellen Sie sich vor, Sie nehmen eine Änderung vor, die Sie für das Commit bbb2222 A second commit
möchten:
$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
Nachdem Sie Ihre Änderungen vorgenommen haben, können Sie sie wie üblich zum Index hinzufügen und dann mit dem Argument --fixup
mit einem Verweis auf das Commit, das Sie --fixup
möchten, --fixup
:
$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit
Dadurch wird ein neues Commit mit einer Commit-Nachricht erstellt, die Git während einer interaktiven Rebase erkennen kann:
$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
Führen Sie als Nächstes eine interaktive Basis mit dem Argument --autosquash
:
$ git rebase --autosquash --interactive HEAD~4
Git wird Ihnen vorschlagen, das Commit, das Sie mit dem commit --fixup
in die richtige Position zu commit --fixup
:
pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit
Um zu vermeiden, dass Sie --autosquash
auf jeder Basisstation eingeben müssen, können Sie diese Option standardmäßig aktivieren:
$ git config --global rebase.autosquash true
Quetsch-Commit beim Zusammenführen
Sie können git merge --squash
, um die von einem Zweig eingeführten Änderungen in einem einzigen Commit zu git merge --squash
. Es wird kein tatsächliches Commit erstellt.
git merge --squash <branch>
git commit
Dies ist mehr oder weniger gleichbedeutend mit der Verwendung von git reset
, ist jedoch bequemer, wenn die eingegebenen Änderungen einen symbolischen Namen haben. Vergleichen Sie:
git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit
Autosquashing und Korrekturen
Beim Festschreiben von Änderungen kann festgelegt werden, dass das Commit in Zukunft auf ein anderes Commit komprimiert wird.
git commit --squash=[commit hash of commit to which this commit will be squashed to]
Man könnte auch --fixup=[commit hash]
alternativ zu fixup verwenden.
Es ist auch möglich, Wörter aus der Festschreibungsnachricht anstelle des Festschreibungs-Hashwerts zu verwenden.
git commit --squash :/things
wo das letzte Commit mit dem Wort "Dinge" verwendet würde.
Diese Commits-Nachricht würde mit 'fixup!'
oder 'squash!'
gefolgt von dem Rest der Commit-Nachricht, in die diese Commits zerquetscht werden.
Beim Umbasieren sollte --autosquash
flag verwendet werden, um die Funktion autosquash / fixup zu verwenden.