Aktualisieren
Ich habe einen Alias gemacht git squash-all
.
Anwendungsbeispiel : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Vorsichtsmaßnahme : Denken Sie daran, einen Kommentar abzugeben, da sonst die Standard-Commit-Meldung "Ein neuer Start" verwendet wird.
Oder Sie können den Alias mit dem folgenden Befehl erstellen:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Einzeiler
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Hinweis : Hier ist " A new start
" nur ein Beispiel. Sie können auch Ihre eigene Sprache verwenden.
TL; DR
Keine Notwendigkeit zu quetschen, verwenden git commit-tree
, um ein Orphan Commit zu erstellen und damit zu gehen.
Erklären
Erstellen Sie ein einzelnes Commit über git commit-tree
Was git commit-tree HEAD^{tree} -m "A new start"
tut ist:
Erstellt ein neues Festschreibungsobjekt basierend auf dem bereitgestellten Baumobjekt und gibt die neue Festschreibungsobjekt-ID auf stdout aus. Die Protokollnachricht wird von der Standardeingabe gelesen, sofern nicht die Optionen -m oder -F angegeben sind.
Der Ausdruck HEAD^{tree}
bedeutet das Baumobjekt HEAD
, das der Spitze Ihres aktuellen Zweigs entspricht. siehe Tree-Objects und Commit-Objects .
Setzen Sie den aktuellen Zweig auf das neue Commit zurück
git reset
Setzen Sie dann einfach den aktuellen Zweig auf das neu erstellte Commit-Objekt zurück.
Auf diese Weise wird nichts im Arbeitsbereich berührt, und es besteht keine Notwendigkeit für Rebase / Squash, was es sehr schnell macht. Die benötigte Zeit spielt für die Größe des Repositorys oder die Verlaufstiefe keine Rolle.
Variation: Neues Repo aus einer Projektvorlage
Dies ist nützlich, um das "anfängliche Festschreiben" in einem neuen Projekt unter Verwendung eines anderen Repositorys als Vorlage / Archetyp / Startwert / Skelett zu erstellen. Zum Beispiel:
cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")
Dadurch wird vermieden, dass das Vorlagen-Repo als Remote ( origin
oder auf andere Weise) hinzugefügt wird, und der Verlauf des Vorlagen-Repos wird in Ihrem anfänglichen Commit zusammengefasst.