Aggiornare
Ho fatto un alias git squash-all
.
Esempio di utilizzo : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Avvertimento : ricordarsi di fornire un commento, altrimenti verrebbe utilizzato il messaggio di commit predefinito "Un nuovo inizio".
Oppure puoi creare l'alias con il seguente comando:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Una fodera
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Nota : qui "A new start
" è solo un esempio, sentiti libero di usare la tua lingua.
TL; DR
Non c'è bisogno di schiacciare, usare git commit-tree
per creare un commit orfano e seguirlo.
Spiegare
creare un unico commit tramite git commit-tree
Quello che git commit-tree HEAD^{tree} -m "A new start"
fa è:
Crea un nuovo oggetto commit basato sull'oggetto albero fornito ed emette il nuovo ID oggetto commit su stdout. Il messaggio di registro viene letto dall'input standard, a meno che non vengano fornite le opzioni -m o -F.
L'espressione HEAD^{tree}
indica l'oggetto albero corrispondente HEAD
, ovvero la punta del ramo corrente. vedi Tree-Objects e Commit-Objects .
reimpostare il ramo corrente sul nuovo commit
Quindi git reset
reimpostare semplicemente il ramo corrente sull'oggetto commit appena creato.
In questo modo, non viene toccato nulla nell'area di lavoro, né è necessario rebase / squash, il che lo rende davvero veloce. E il tempo necessario è irrilevante per le dimensioni del repository o la profondità della cronologia.
Variazione: nuovo repo da un modello di progetto
Ciò è utile per creare il "commit iniziale" in un nuovo progetto usando un altro repository come template / archetype / seed / skeleton. Per esempio:
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")
Ciò evita di aggiungere il repository di modelli come remoto ( origin
o in altro modo) e comprime la cronologia del repository di modelli nel commit iniziale.