Flatten commits en una twig

¿Es posible condensar las confirmaciones en una twig en una única confirmación antes de fusionarse con la principal? Pensé que este sería un escenario bastante común, pero tal vez no estoy usando los términos de búsqueda correctos.

Explicaré el escenario con más detalle. A menudo me gustaría hacer muchas confirmaciones locales mientras trabajo en un cambio en una sucursal para asegurarme de tener un historial exhaustivo de cambios. Pero de una vez con los cambios en la twig, cuando me estoy fusionando con main, me gustaría networkingucir las confirmaciones en la twig a una sola y luego fusionarla a main. Entiendo que las confirmaciones no son costosas en Git, pero en algunas situaciones, tal vez prefiera hacer esto.

* merge to main |\ * | commit 2 on main * | commit 1 on main | * commit 2 on branch | * commit 1 on branch |/ * branch from main 

hacerse para que se vea como

 * merge to main |\ * | commit 2 on main * | commit 1 on main | * commit on branch (branch commits flattened to one) |/ * branch from main 

Soy un novato cuando se trata de git. Si me equivoqué en el uso de los términos, me disculpo.

Use el rebasamiento interactivo. Encuentra la confirmación donde tu twig divergió de la maestra (puede usar git merge-base , llamemos a commit <diverge> ), luego

 git rebase -i <diverge> 

y aparecerá un editor que te permitirá reescribir la historia de forma interactiva. Querrás aplastar commits.

Recomiendo aprender a usar la database interactiva, pero en caso de que te parezca demasiado complicado, puedes simplemente usar

git reset --soft <diverging-commit>

deshacer todos los commits hasta el punto divergente sin cambiar el índice, y

git commit -s

hacer una sola confirmación de todos los cambios.

También puede usar git merge --squash <branch> para fusionar una bifurcación sin realizar ningún commit:

 $ git checkout master $ git merge --squash mybranch ... Squash commit -- not updating HEAD Automatic merge went well; stopped before committing as requested $ git commit 

Por supuesto, debes resistir el impulso de hacer esto si puedes evitarlo. Vea " No mentirás": git rebase, corrige, aplasta y otras mentiras para una discusión sobre por qué.

Mira git rebase . La opción -i te da la posibilidad de editar, aplastar (lo que quieras), o incluso eliminar, confirma.

Por ejemplo, la forma en que lo uso generalmente es como:

 git rebase -i origin/master .... git push