2011-11-03 47 views
29

¿Cómo realizo el equivalente al TFS 'Deshacer cambios pendientes' en Git, en uno o varios archivos?Cómo realizar el equivalente TFS de 'Deshacer cambios pendientes'

Eso significa básicamente que hacer estos pasos:

  • deshacer los cambios en el disco
  • Restablecimiento de cualquier cambio Git ha descubierto
  • Obtención de los últimos cambios en el archivo de Git

Se Sería bueno saber las diferencias (si hay alguna) en los comandos para hacer esto si tiene (1) simplemente lo cambió en el disco, sin agregarlo, pero también cuando haya (2) hecho el comando add- y para una bonificación, (3) incluso cuando haya confirmado el cambio.

Respuesta

31

Para 1 y 2, todo lo que tiene que hacer es:

git stash -u #same effect as git reset --hard, but can be undone 

esto va a tirar a la basura cualquier cambio. Tenga cuidado si usa reset. Lea sobre la manipulación del índice y las permutaciones de las opciones duras, suaves y mixtas con el reinicio y el pago. El libro progit explica esto en detalle: http://progit.org/2011/07/11/reset.html

Para 3,

git reset --hard HEAD^ 

pero sería mejor para emitir una git stash -u antes de esto - por si acaso usted tiene cambios pendientes.

Esto restablecerá la rama actual al padre de la confirmación actual. Busque "tree-ish" en línea.^y ~ N después de una referencia le permitirá señalar cualquier punto alcanzable en el historial de esa referencia. Para entender cómo la historia se realiza un seguimiento en Git, "Git para los informáticos" explica la Dirigido acíclicos Gráfico así: http://eagain.net/articles/git-for-computer-scientists/

para obtener los archivos individuales desde el estado de la corriente de pago comprometerse (es decir, tirar a la basura los cambios), se puede utilizar

git checkout HEAD -- <a list of files> 

Si emitió el último comando de reinicio anterior por error, no tiene problemas. Git realiza un seguimiento del lugar donde las ramas solían apuntar en el reflog.

git reflog 

le mostrará la historia. Se puede ver en que la producción de cómo hacer referencia a cada uno, así:

git reset --hard [email protected]{1} 

restablecerá la rama en donde solía ser de 1 cambio antes.

Para añadir, si desea borrar ficheros ignorados y archivos sin seguimiento, se puede limpiar con esto:

git clean -xdf 
+0

Ten cuidado; git no le preguntará con un diálogo bonito (¿irritante?) para seleccionar qué archivos modificados desea deshacer cambios pendientes. :) –

+1

una forma de hacerlo sería agregar el parámetro -p, que le indicará cada trozo de cambios. Puede decir 'a' o' d' para trabajar en archivos completos en lugar de 'y' o' n' para trozos individuales. –

4

Este comando va a deshacer los cambios locales y restaurarlos a las versiones actuales en el repositorio:

git reset --hard 

puede volver a su última válida commit mediante la emisión:

git reset --hard HEAD 

I f lo que desea restaurar un solo archivo, el uso git checkout en su lugar:

git checkout -- file_name.extension 
git checkout HEAD file_name.extension 
+2

¿Por qué se hace una distinción entre 'git reset --hard' y' git reset --hard HEAD'? – manojlds

2
  1. git checkout [path] o (toda cesión temporal) git reset --hard HEAD
  2. git reset [path] seguido por git checkout [path]
  3. git reset --hard [commit] para restaurar el estado de la cesión temporal en [commit], que debe ser un tree-ish
0

Mi equivalente a TFS undo en Git con Eclipse es simplemente hacer clic con el botón derecho en el archivo y seleccionar Replace with ->HEAD Revision (o la versión que desee).

Cuestiones relacionadas