2010-12-29 8 views
7

Actualmente estoy aprendiendo git, generalmente soy un poco escéptico de VCS ya que me cuesta acostumbrarme a ellos.¿Nunca se borra nada en git?

Eliminé una rama llamada "experimental" con algunos archivos tmp, vi los archivos eliminados en mi directorio de trabajo, así que me rasqué la cabeza y me pregunté si esto era normal, ¿puedo volver a traerlo en caso de que lo necesite nuevamente? etc.

Encontré el SHA haciendo la confirmación de los archivos tmp y recreé la rama con el sha proporcionado y lo volví a ver con todos los archivos y su contenido actual.

Todo lo que hago en el directorio de trabajo se puede revertir una vez que lo confirmo?

puede parecer una pregunta tonta a muchas personas, pero es algo que me intriga lo que yo quiero saber los límites

Respuesta

7

Casi todas las acciones se pueden revertir si ha realizado los cambios correspondientes a sus archivos. Incluso si fuerza una bifurcación o realiza un restablecimiento completo, puede encontrar los objetos de compromiso sueltos usando git reflog o git fsck.

Sin embargo,, los objetos sueltos se limpian de vez en cuando por git gc, por lo que no podrá recuperarlos después de un tiempo.

+0

Tiene que establecer deliberadamente un ajuste bajo 'gc.pruneexpire' para' git gc' para podar inmediatamente los objetos inalcanzables. Su última oración implica que ejecutar 'git gc' manualmente puede ser especial. –

+0

@Charles: Reformé la última oración. Tienes razón, no quise decir que un 'git gc' manual corta inmediatamente los objetos sueltos. Solo quería señalar que 'git gc' se ejecuta automáticamente, pero también se puede ejecutar manualmente. – 3lectrologos

+0

¿Esta respuesta se aplica solo al repositorio git local, o también al control remoto cuando se presiona (en el caso de un control remoto centralizado, por ejemplo)? – nha

1

git reset --hard puede eliminar los cambios de forma irreversible

+0

-1: 'git reset --hard' no es irreversible. – 3lectrologos

+0

@ 3lectrologos hmm interesante ... ¿Cómo puedo deshacer el reinicio total? – seriyPS

+2

Creo que @ 3lectrologos asume el estado "una vez que me comprometo". –

2

Todo lo que hago en el directorio de trabajo puede ser revertido una vez que yo lo cometo?

Sí puede. Como ejemplo, intente git reflog. Esto le dará una lista de confirmaciones hechas en la rama actual. Elija uno por su suma sha1, luego escriba git checkout 45db2a.... Eso comprueba que commit. Asegúrese de git checkout HEAD o git checkout -b newbranch desde ese punto si desea realizar cambios.

También puede usar git para seleccionar estas confirmaciones sobre su actual HEAD (es decir, si se hacen en una rama diferente, puede extraerlas). This pregunta lo discute mucho mejor que yo.

+0

Después de ver las respuestas, me estoy acostumbrando un poco, es un poco confuso pero no tanto, la diferencia (al menos para mí es) al empujar/tirar al servidor. Ahora, no sé si preguntar en stackoverflow o aquí, pero ¿por qué la ejecución en seco "git rm" no funciona? Tuve que eliminar todo mi directorio para reflejarlo en el servidor privado. Quiero guardar mis archivos y eliminar los que están en el servidor – allenskd

+0

Ah, ya veo. Puede obligar a las ramas a ser eliminadas de un repositorio remoto haciendo esto: 'git push remotename: branchname' (sintaxis extraña,' git push branchname' lo empuja. La diferencia es solo ':'). No sé si puedes hacer esto usando commits individuales, esa es una pregunta interesante. –

2

El punto principal de cualquier VCS serio es mantener todo el historial de un proyecto de forma permanente e inmutable. Para que pueda en cualquier momento ir a una revisión arbitraria de su trabajo.

Existe un comportamiento especial de git cuando se trata de su almacenamiento, ya que puede eliminar objetos si no hay referencias. Las referencias son:

  • cada cabeza de una rama
  • etiquetas (no estoy seguro de si una etiqueta anotada sin referencias todavía actúa como una referencia activa)
  • cada confirmación que está referenciado por otro comprometen
  • el contenido de una reflog de sucursal

Esto significa que se conservan todas las confirmaciones, que son parte de una sucursal, también cada objeto (= mayormente confirma) que están etiquetados.También hay un llamado reflog en cada rama (a menos que esté desactivado), donde git guarda referencias a todos los objetos que creaste en los últimos días. Cuando un objeto no está referenciado por ninguna rama, etiqueta o reflog, git gc lo elimina de la base de datos. Este es el caso típico cuando creaste una rama de piratería, allí cometiste algunas cosas y eliminaste esta rama sin fusionarla en otra.

Cuestiones relacionadas