2010-09-15 15 views
57

Estoy tratando de aprender a usar Git efectivamente y me pregunto cómo debo (buenas prácticas de la práctica/malo?) Resolver el siguiente caso:movimiento de maestro se compromete a una rama usando git

Say I tienen la siguiente cadena de confirmaciones en master:

  • inicial comprometen
  • commit 1
  • commit 2
  • commit 3

Luego me doy cuenta de que lo que se hizo en los dos últimos commits es completamente incorrecto y necesito comenzar desde el Commit 1 nuevamente. Preguntas:

  • ¿Cómo debo hacer eso?
  • ¿Puedo mover Commit 2 y 3 a una sucursal separada para mantener para referencia futura (digamos que no fueron tan malos después de todo) y continuar trabajando desde el Commit 1 en el master?

Respuesta

70
git branch tmp   # mark the current commit with a tmp branch 
git reset --hard Commit1 # revert to Commit1 

El SO respuesta "What's the difference between 'git reset' and 'git checkout' in git?" es muy instructivo para ese tipo de operación

alt text

Un git reset --hard HEAD~2 haría lo mismo (sin necesidad de volver a la SHA1 para Commit1 primero).

Desde Commit2 y Commit3 siguen referencia por un ref Git (en este caso una rama), todavía se puede volver a ellos en cualquier momento que desee (git checkout tmp).


En realidad, Darien menciones en los comentarios (con respecto a mover Commit2 y Commit3 a otra rama):

accidentalmente comprometido con la rama mal, esto me deja mover, lo hizo:

git checkout correctbranch 
git rebase tmp 
git branch -d tmp 

Esto funciona aquí ya que la rama inicial se ha restablecido a Commit1, lo que significa que el git rebase tmp reproducirá cada confirmación después de Commit1 (así que aquí Commit2 y Commit3) al nuevo 'correctbranch'.

+0

Gracias! Solo una observación: en gitk, la rama de tmp no se muestra. ¿No debería hacerlo, ya que Commit1 es común para ambas ramas? – Paul

+5

@Paul: ¿has probado un "' gitk --all' "? – VonC

Cuestiones relacionadas