Actualizar
He hecho un alias git squash-all
.
Ejemplo de uso : git squash-all "a brand new start"
.
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
Advertencia : recuerde proporcionar un comentario; de lo contrario, se usará el mensaje de confirmación predeterminado "Un nuevo comienzo".
O puede crear el alias con el siguiente comando:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
Un trazador de líneas
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Nota : aquí " A new start
" es solo un ejemplo, siéntase libre de usar su propio idioma.
TL; DR
No es necesario aplastar, usar git commit-tree
para crear una confirmación huérfana e ir con ella.
Explique
crear una única confirmación a través de git commit-tree
Lo que git commit-tree HEAD^{tree} -m "A new start"
hace es:
Crea un nuevo objeto de confirmación basado en el objeto de árbol proporcionado y emite el nuevo ID del objeto de confirmación en stdout. El mensaje de registro se lee desde la entrada estándar, a menos que se den las opciones -m o -F.
La expresión HEAD^{tree}
significa el objeto del árbol correspondiente HEAD
, es decir, la punta de su rama actual. ver Tree-Objects y Commit-Objects .
restablecer la rama actual a la nueva confirmación
Luego, git reset
simplemente restablezca la rama actual al objeto de confirmación recién creado.
De esta manera, no se toca nada en el espacio de trabajo, ni hay necesidad de rebase / squash, lo que lo hace realmente rápido. Y el tiempo necesario es irrelevante para el tamaño del repositorio o la profundidad del historial.
Variación: Nuevo repositorio de una plantilla de proyecto
Esto es útil para crear el "commit inicial" en un nuevo proyecto usando otro repositorio como template / archetype / seed / skeleton. Por ejemplo:
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")
Esto evita agregar el repositorio de plantillas como un control remoto ( origin
o de otro modo) y contrae el historial del repositorio de plantillas en su confirmación inicial.