2011-07-08 23 views
7

Uh oh ... He cometido un error bastante complejo (incluyendo el subdirectorio y el cambio de nombre de los archivos) sin saber realmente qué estoy haciendo (o qué estaría haciendo Git) .Git: Cómo deshacer commit * y * revertir a la última rama

ahora quiero deshacer todo de tal manera que:

  1. confirmación se invierte por completo (como si que nunca se ha hecho, quizás sacarlo de la historia también)
  2. Restaurar directorio de trabajo actual (donde .git es) a una determinada rama (la última lo hará por ahora).

He encontrado referencias a git reset --soft y git reset --hard pero ya han demostrado a mí mismo que puedo hacer verdadero daño por prematuramente mediante un comando sin comprender plenamente. :)

he encontrado el git reset man page pero todavía estoy confundido en cuanto a:

  1. ¿Cuál es HEAD?
  2. ¿Cuál es la diferencia entre HEAD y * master?
  3. En mi situación (ver arriba) ¿Necesito usar necesito usar --soft, --hard o otro (3 opciones más)?
  4. ¿Debo ejecutar otro comando (después de hacer git reset) al "finalizar" la inversión?

ACTUALIZACIÓN: Después de leer la respuesta a continuación:

  1. hacer yo entendido bien que todo lo que necesito hacer en mi situación es cuestión un solo comando git reset --hard HEAD^?
  2. ¿Cómo verifico que la inversión fue realizada correctamente?
+2

Dado que está aprendiendo git, permítame recomendarle dos libros: [git community book] (http://book.git-scm.com/index .html) y [pro git] (http://progit.org/book/), que están completamente en línea. – shelhamer

+0

@Shelhamer ¡Gracias! – WinWin

Respuesta

7
  1. HEAD es el último commit de la rama desprotegido.
  2. master es una sucursal (la sucursal principal, por convención) mientras que HEAD es una ubicación en la historia de la sucursal desprotegida. HEAD es relativo a la rama en la que se encuentra.
  3. git reset --soft dejará sus cambios en el árbol de trabajo, sin compromiso para que usted pueda hacer lo que quiera. git reset --hard restaurará el árbol de trabajo al estado en el que estaba cuando se reinició.
  4. No se necesitan otros comandos.

En primer lugar, para mantener el comprometerse en caso de que desee inspeccionarlo después, realizar una rama: (. O alternativamente hacer git branch my_bad_commit como se menciona en el comentario de larsman)

git checkout -b my_bad_commit 

luego regresar a master o lo que sea la rama que se encontraba y RESET:

git checkout branch_with_bad_commit 
git reset --hard HEAD^ 

CABEZA^traduce en "la p arent of HEAD, "que incluso puedes apilar para HEAD ^^ = 2 commits back. Para obtener más información sobre este tema, consulte el capítulo del libro de la comunidad git en undo in git

+1

El 'checkout -b; la secuencia de checkout' se puede hacer usando un solo comando 'branch'. –

+0

Buen punto para mencionar eso. Tengo tantos alias que acabo de hacer 'git cob new_branch_name' que a veces olvido los reales. – shelhamer

+0

@Shelhamer Ejecutando tanto 'git checkout master' ** como **' git reset --hard HEAD^'me llevó ** two ** commits back. Esto no es lo que yo quería. Solo necesitaba ir hacia atrás. Algo no debe haber sido claro en mi pregunta. – WinWin

1
  1. HEAD es el tip of the current branch.
  2. La diferencia entre HEAD y master es que HEAD cambia cuando pagas una sucursal (o confirma).
  3. --soft dejará los cambios, para que pueda volver a agregarlos/confirmarlos o deshacerlos haciendo git checkout en los archivos modificados. --hard restablecerá el área de trabajo al estado de la confirmación a la que está restableciendo.
  4. No si reset --hard. Es posible que tenga que git push --force para los repos remotos (aunque, si los cambios que realizó ya están en un control remoto, se desaconseja enérgicamente el historial de reescritura).
+0

Gracias +1. Afortunadamente, no he empujado nada todavía. Por lo tanto, 'git reset --hard HEAD ^' ¿solo me funciona? – WinWin

+2

Si desea deshacer solo el último compromiso, sí. Para estar seguro, también puedes hacer 'git branch error' antes del' git reset --hard'; si algo sale mal, entonces puedes 'git fusionar error' para recuperar el commit equivocado. –

+0

OMG después de usar CVS durante tantos años, me siento como un novato total en este mundo de git. :) – WinWin

Cuestiones relacionadas