2012-08-08 15 views
9

Tengo branch foo off master/head. Quería enmendar al maestro/jefe y hacer que estos cambios fueran recogidos en la rama foo. Hice lo siguiente:Cómo hacer commit git --mendar un commit que es la base de una rama

git checkout master 
git add ... 
git commit --amend 
git checkout foo 
git rebase master 

El problema era el viejo no modificado cometer aparece como parte de la rama foo después de la modificación, y se puso en porcentualizada maestro. Hice un git rebase -i y eliminé el antiguo commit y funcionó, pero ¿hay alguna manera más fácil/segura de modificar el commit que es la base de una rama? Y sí, es todos los envíos locales que no han sido empujados ..

Respuesta

11

Todo lo que tenía que hacer era decirle a Git dónde empezar el rebase de: Usted puede hacer esto

git rebase --onto master SOMESHA foo 

Donde es la SOMESHA viejo maestro SHA. Esto es, si su árbol ahora se ve así

* aaaaaa - (master) 
| * bbbbbb - (foo) 
| * cccccc - (old master) 
|/ 
* ffffff 

y usted

git rebase --onto master cccccc foo 

Su árbol el siguiente aspecto.

* dddddd - (foo) 
| 
* aaaaaa - (master) 
| 
* ffffff 

LADO: podemos usar diferentes nombres para el cccccc comprometerse si no te gusta el uso de valores SHA.

> git reflog master 

aaaaaa [email protected]{0}: reset: moving to something 
cccccc [email protected]{1}: commit: change the froozle 
ffffff [email protected]{2}: commit: snarf the froozle 

Esto significa que podemos hacer referencia a cccccc como [email protected]{1} (AKA, la ubicación anterior del maestro)

Así que podría escribir esta sincronización como

git rebase --onto master [email protected]{1} foo 

Otra descripción de la confirmación tiene cccccc es foo^ (AKA, parernt commit for foo), entonces también podríamos escribir esto como

git rebase --onto master foo^ foo 

Todos hacen exactamente lo mismo, y es posible que prefiera usar diferentes en diferentes situaciones. Normalmente me resulta fácil utilizar el SHA, ya que a menudo extraeré un gráfico de mi repositorio antes de realizar este tipo de operación.

+0

Gracias, esto funciona – Aaron

+0

En lugar de la confirmación SHA también puede usar 'master @ {1}'. – chbaker0

+0

@ chbaker0 tienes toda la razón: inicialmente pensé que sugerías algo diferente. Estoy agregando esa sugerencia a la respuesta con una explicación. –