2010-04-28 16 views
10

He leído que Git principalmente agrega información sobre el historial del repositorio, tratando de recordar cada cambio realizado, pero que también hay comandos que hacen cambios irreversibles.¿Cuáles son los comandos destructivos en git?

¿Cuáles son los comandos a los que realmente debo prestar atención y evitar usarlos incorrectamente porque no hay vuelta atrás?

+0

Cuando responda la siguiente pregunta, recuerde explicar lo que hace el comando. –

Respuesta

9

Aquí hay dos tipos de "destructivos": comandos que son destructivos para su historial de git y comandos que descartan los cambios en su copia de trabajo.

comandos que descartan árbol de trabajo cambia:

  1. git reset
  2. git checkout

Como otros han mencionado, la combinación de la reflog y el hecho de que los objetos git no lo hacen de inmediato se descarta (a menos que active la limpieza automática) significa que normalmente puede deshacer operaciones como git reset/rebase/merge.

Estos comandos, aunque, en realidad objetos descarte git, lo que elimina la posibilidad de deshacer:

  1. git gc (por defecto, esta ciruelas pasas objetos inalcanzables que son al menos 2 semanas de edad)
+1

En mi opinión, los comandos de git más destructivos son aquellos que descartan el árbol de trabajo. Debería ser siempre seguro "hacer una copia de seguridad" con 'git stash'; git stash pop '. Más adelante (hasta su límite de ciruela pasa) recupere las versiones "perdidas" a través de un comando como: gitk --all -n 5000 --todo $ (git fsck | awk '/ colgar compromiso/{imprimir $ 3}'; git log -g --pretty = 'formato:% H') [esto abrirá la interfaz de gitk con hasta 5000 confirmaciones, incluidas todas las confirmaciones "perdidas"]. –

2

git reset --hard no se puede deshacer

+0

true, when no commited – Lauri

7

Según http://blog.reverberate.org/2009/07/30/gits-needs-a-new-interface/

$ git checkout foo.c 

... sobrescribirá cualquier modificación local que pueda tener a Foo.c sin preguntar.

+1

Es cierto, es incluso más destructivo de lo que pensaba. Acabo de hacer un 'git checkout 6bb33a8 .' esperando obtener el archivo que cambió en esa confirmación, pero también borró mis cambios en otros archivos, reemplazándolos con los contenidos en ese commit. Pensé que podría pegar algo en el reflog para protegerme, pero no tuve tanta suerte. –

3

Puede perder cambios no confirmados utilizando el comando git reset. Si se confirman los cambios, está protegido por el reflog durante varios días antes de que se limpie por gc.

Por ejemplo, si checkout, rebase, reset o merge la que todos introducen cambios, puede volver a una confirmación anterior ejecutando el comando reflog y el uso de reset para restablecer la cabeza a un viejo comprometerse.

Cuestiones relacionadas