2010-07-14 10 views
9

Cuando tengo una solución para un cambio que se cometió antes, siempre termino ejecutando rebase dos veces seguidas. ¿Es posible hacer este flujo de trabajo todo en un solo paso? Digamos que tengo 4 nuevos commits.¿Puedo volver a establecer la base y aplastar las confirmaciones al mismo tiempo?

* (master) D 
* C 
* B 
* A 
* Base 

Encuentro un error en B así que creo una rama y la arreglo.

* (master) D 
* C 
| * (fix) Fix. 
|/ 
* B 
* A 
* Base 

siguiente que ejecuta git rebase --onto fix B D para mover C y D a B.

* (master) D' 
* C' 
* (fix) Fix. 
* B 
* A 
* Base 

Finalmente corro git rebase --i fix^^ para ver los últimos compromete y me aplaste B y fijar en una única confirmación.

* (master) D' 
* C' 
* B' 
* A 
* Base 

¿Existe alguna manera más rápida de lograr el mismo flujo de trabajo? Imagino que la fusión sería más fácil, pero la fusión se me escapó porque estoy usando git svn, que requiere un historial lineal.

+2

tal vez las opciones 'fixup' y' autosquash' podrían ayudar aquí? http://stackoverflow.com/questions/2302736/trimming-git-checkins-squashing-git-history/2302947#2302947 – VonC

+0

@VonC Gracias, al menos, estos pasos serán un poco más rápidos. –

+0

excelente (para empezar). Podría publicar una respuesta que ilustre cómo los pasos son más rápidos con esas opciones. – VonC

Respuesta

5

Cuando aparece el editor de la lista de confirmaciones en una base de datos interactiva, puede añadir, eliminar o reordenar confirmaciones de su agrado. Básicamente es una forma de influir en el "cherry-picking-in-a-loop" que va a tener lugar (eso es a lo que se reduce la rebase).

+0

La parte ADD es lo que me faltaba. Gracias. –

3

¿Conoce la opción --squash en git merge?

--squash

producir el árbol de trabajo y el estado índice como si ocurrió una verdadera fusión (a excepción de la información de combinación), pero en realidad no hacen una confirmación o mover el HEAD, ni registro $GIT_DIR/MERGE_HEAD para hacer que el el siguiente comando de commit de git para crear un commit de fusión. Esto le permite crear una única confirmación en la parte superior de la rama actual, cuyo efecto es el mismo que la fusión de otra rama (o más en el caso de un pulpo).

+0

+1 porque no sabía sobre --squash. Sin embargo, esto requiere la misma cantidad de pasos. Después de crear la corrección, en lugar de dos rebases, necesitaría hacer git merge --squash, luego git commit at the head, y luego git rebase -i para reordenar y aplastar la corrección en la confirmación con el error. –

Cuestiones relacionadas