2012-07-30 26 views
13

¿Es posible condensar las confirmaciones de una bifurcación 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.Aplanar confirmaciones en una rama

Explicaré la situación 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 rama, cuando me estoy fusionando con main, me gustaría reducir las confirmaciones en la rama 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 

que deban hacerse a parecerse a

* 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.

Respuesta

12

Utilice el reajuste interactivo. Encuentra la confirmación en su rama se separó de maestro (puede usar git merge-base; vamos a llamar el commit <diverge>), entonces

git rebase -i <diverge> 

y un editor aparecerá, lo que le permite volver a escribir la historia de forma interactiva. Querrás aplastar commits.

+1

Gracias. Después de buscar más seguidores siguiendo su sugerencia, encontré esta (http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/) publicación que atraviesa una ejemplo. –

2

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

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

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

recomendaría aprender a usar el rebase interactivo, pero en caso de que parece demasiado complicado para usted, usted puede simplemente utilizar

git reset --soft <diverging-commit>

para deshacer todas las confirmaciones hasta el punto divergente sin cambiar el índice, y

git commit -s

para realizar una única confirmación de todos los cambios.

10

También puede utilizar git merge --squash <branch> de fusionar una rama 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, usted debe resistir la tentación de hacer esto si puede evitarlo. Vea Thou Shalt Not Lie: git rebase, amend, squash, and other lies para una discusión sobre por qué.

+6

El artículo sobre la mentira parece demasiado preocupado con "mentir para que te veas bien". Eso está muy bien, pero ¿qué hay de reorganización se compromete a hacer la revisión del código más simple para el crítico, un objetivo honorable. ¿Qué tan malo sería mentir en este contexto? – guioconnor

Cuestiones relacionadas