Mise à jour
J'ai fait un alias git squash-all
.
Exemple d' utilisation : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Attention : n'oubliez pas de fournir un commentaire, sinon le message de validation par défaut "Un nouveau départ" serait utilisé.
Ou vous pouvez créer l'alias avec la commande suivante:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Bon mot
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Remarque : ici " A new start
" n'est qu'un exemple, n'hésitez pas à utiliser votre propre langue.
TL; DR
Pas besoin de squash, utilisez git commit-tree
pour créer un commit orphelin et allez-y.
Explique
créer un seul commit via git commit-tree
Qu'est git commit-tree HEAD^{tree} -m "A new start"
- ce que c'est:
Crée un nouvel objet de validation basé sur l'objet d'arborescence fourni et émet le nouvel identifiant d'objet de validation sur stdout. Le message du journal est lu à partir de l'entrée standard, sauf si les options -m ou -F sont fournies.
L'expression HEAD^{tree}
signifie l'objet arbre correspondant à HEAD
, à savoir la pointe de votre branche actuelle. voir Tree-Objects et Commit-Objects .
réinitialiser la branche actuelle au nouveau commit
Ensuite, git reset
réinitialisez simplement la branche actuelle sur l'objet de validation nouvellement créé.
De cette façon, rien dans l'espace de travail n'est touché, ni besoin de rebase / squash, ce qui le rend vraiment rapide. Et le temps nécessaire n'est pas pertinent pour la taille du référentiel ou la profondeur de l'historique.
Variation: nouveau référentiel à partir d'un modèle de projet
Cela est utile pour créer le "commit initial" dans un nouveau projet en utilisant un autre référentiel comme modèle / archétype / graine / squelette. Par exemple:
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")
Cela évite d'ajouter le référentiel de modèles en tant que distant ( origin
ou autre) et réduit l'historique du référentiel de modèles dans votre validation initiale.