Pregunta

Es posible deshacer los cambios causados por el comando siguiente?Si es así, ¿cómo?

git reset --hard HEAD~1
¿Fue útil?

Solución

Pat, Ni es correcto.Usted puede obtener la confirmación de la espalda tanto tiempo como lo ha sido dentro de un par de días.git sólo recoge la basura después de un mes o así que a menos que explícitamente diga a fin de eliminar las nuevas notas.

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

Se puede ver en el ejemplo, que el archivo2 fue retirado como resultado del hard reset, pero se puso de nuevo en su lugar cuando restablezco a través de la reflog.

Otros consejos

Lo que quiero hacer es especificar el sha1 de la confirmación de que desea restaurar.Usted puede conseguir el sha1 mediante el examen de la reflog (git reflog) y, a continuación, haciendo

git reset --hard <sha1 of desired commit>

Pero no espere demasiado tiempo...después de un par de semanas git finalmente verá que cometemos como sin referencia y eliminar todas las notas.

La respuesta está oculta en la respuesta detallada anteriormente, usted puede simplemente hacer:

$> git reset --hard HEAD@{1}

(Vea la salida de git reflog mostrar)

Es posible recuperar si Git no ha recolección todavía.

Obtener una visión general de los colgantes se compromete con fsck:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Recuperar la colgantes comprometerse con reajuste:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Si tienes suerte, como yo, usted puede ir de nuevo en el editor de texto y pulsar el botón 'deshacer'.

Sé que no es realmente una respuesta apropiada, pero me salvó la mitad de un día de trabajo así que espero que va a hacer lo mismo por alguien más!

Ejemplo de IRL caso:

$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
dangling blob 9183b84bbd292dcc238ca546dab896e073432933
dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
dangling blob b87163c8def315d40721e592f15c2192a33816bb
dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

commit f6ce1a403399772d4146d306d5763f3f5715cb5a
Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local>
Date:   Wed Aug 15 08:41:30 2012 +0200

    *MY COMMIT MESSAGE IS DISPLAYED HERE*

diff --git a/Some.file b/Some.file
new file mode 100644
index 0000000..15baeba
--- /dev/null
+++ b/Some.file
*THE WHOLE COMMIT IS DISPLAYED HERE*

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

First, rewinding head to replay your work on top of it...
Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.

hasta donde yo sé, --hard se descarta cambios no confirmados.Ya que estos no son tenidos en cuenta por git.pero usted puede deshacer el discarded commit.

$ git reflog

se enumeran:

b0d059c HEAD@{0}: reset: moving to HEAD~1
4bac331 HEAD@{1}: commit: added level introduction....
....

donde 4bac331 es el discarded commit.

Ahora solo tiene que mover la cabeza para que comprometen a::

$ git reset --hard 4bac331

En la mayoría de los casos, sí.

Dependiendo del estado de su repositorio en el momento de ejecutar el comando, los efectos de la git reset --hard puede variar desde trivial deshacer, básicamente imposible.

A continuación he enumerado una serie de diferentes escenarios posibles, y cómo usted puede recuperarse de ellos.

Todos mis cambios fueron cometidos, sino que ahora el cometa se han ido!

Esta situación generalmente se produce cuando se ejecuta git reset con un argumento, como en git reset --hard HEAD~.No te preocupes, esto es fácil recuperarse de!

Si usted acaba de ejecutar git reset y no he hecho otra cosa desde, usted puede volver a donde estabas con este one-liner:

git reset --hard @{1}

De esta manera se restablece su rama actual sea cual sea el estado en que se encontraba antes de la última vez que fue modificado (en su caso, la modificación más reciente a la rama sería el hard reset usted está tratando de deshacer).

Sin embargo, si usted han hizo otras modificaciones a su sucursal desde el restablecimiento de la línea de arriba no funciona.En su lugar, usted debe ejecutar git reflog <branchname> para ver una lista de todos los cambios recientes realizados en su rama (incluyendo reinicia).La lista se verá algo como esto:

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

Encontrar la operación en esta lista que desea "deshacer".En el ejemplo anterior, sería la primera línea, la que dice "reset:moviendo la CABEZA~".A continuación, copie la representación de la confirmación antes de (abajo) de la operación.En nuestro caso, que sería master@{1} (o 3ae5027, ambas representan el mismo commit), y ejecutar git reset --hard <commit> para restablecer su rama actual de la espalda para que se comprometan.

Yo renové mi los cambios con git add, pero nunca cometió.Ahora mis cambios se han ido!

Este es un poco más difícil recuperarse.git ¿ tener copias de los archivos que ha añadido, pero ya que estas copias nunca fueron atados a ninguna en particular cometer usted no puede restaurar los cambios a la vez.En su lugar, usted tiene que localizar los archivos individuales en el git de la base de datos y restaurar de forma manual.Usted puede hacer esto utilizando git fsck.

Para más detalles, ver Deshacer git reset --hard sin confirmar archivos en el área de ensayo.

He tenido cambios a los archivos en mi directorio de trabajo que nunca puesta en escena con git add, y nunca cometió.Ahora mis cambios se han ido!

Uh oh.Odio tener que decirte esto, pero probablemente usted está fuera de suerte.git no guarda los cambios que usted no añada o se compromete a que, y de acuerdo a la documentación para git reset:

- duro

Restablece el índice y el árbol de trabajo. Cualquier cambio en seguimiento de los archivos en el árbol de trabajo desde <commit> se descartan.

Es posible que usted podría ser capaz de recuperar sus cambios con algún tipo de disco de recuperación de utilidad o un profesional de servicio de recuperación de datos, pero en este punto, que es probablemente más problemas de lo que vale.

Si aún no has basura que se recoge su repositorio (por ejemplo,el uso de git repack -d o git gc, pero ten en cuenta que la recolección de basura también puede ocurrir de forma automática), luego su confirmación todavía está allí – es sólo que ya no son accesibles a través de la CABEZA.

Usted puede tratar de encontrar su confirmación, mirando a través de la salida de git fsck --lost-found.

Las nuevas versiones de Git tiene algo que se llama la "reflog", que es un registro de todos los cambios que se hacen a los árbitros (en contraposición a los cambios realizados en el repositorio de contenidos).Así, por ejemplo, cada vez que usted cambie su CABEZA (es decir,cada vez que haces una git checkout para cambiar ramas) que se registra.Y, por supuesto, su git reset también manipula a la CABEZA, por lo que también fue registrado.Usted puede tener acceso a los estados más antiguos de su refs en un modo similar al que puede tener acceso a los estados más antiguos de su repositorio, mediante el uso de un @ signo en lugar de una ~, como git reset HEAD@{1}.

Me tomó un tiempo para entender cuál es la diferencia entre la CABEZA@{1} y la CABEZA~1, así que aquí va una pequeña explicación:

git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog

Así, HEAD~1 significa "ir a la confirmación antes de la confirmación de que la CABEZA actualmente apunta a", mientras que HEAD@{1} significa "ir a la confirmación de que la CABEZA señaló antes se señaló en donde actualmente puntos".

Que fácilmente le permiten encontrar su pérdida de comprometerse y de recuperación.

Sé que este es un hilo viejo...pero como muchas personas están buscando maneras para deshacer cosas en Git, todavía creo que puede ser una buena idea para seguir dando consejos aquí.

Cuando usted hace una "git add" o mover cualquier cosa, desde la parte superior izquierda a la parte inferior izquierda en git gui el contenido del archivo se almacena en un blob y el contenido del archivo es posible recuperarse de blob.

Así que es posible recuperar un archivo, incluso si no fue cometido, pero tiene que se han añadido.

git init  
echo hello >> test.txt  
git add test.txt  

Ahora la nota es creado, sino que se hace referencia en el índice de modo que no estará en la lista con git fsck hasta que reinicio.Así que restablecer...

git reset --hard  
git fsck  

usted recibirá un colgando blob ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

le dará el contenido del archivo "hola" de nuevo

Para encontrar los comete he encontrado una punta en algún lugar lo que sugiere que esta.

gitk --all $(git log -g --pretty=format:%h)  

La tengo como una herramienta en git gui y es muy práctico.

Antes de contestar le permite agregar un poco de fondo, explicando ¿qué es esto HEAD.

First of all what is HEAD?

HEAD es simplemente una referencia a la actual commit (el más reciente) en la rama actual.
Sólo puede haber un único HEAD en cualquier momento dado.(excluyendo git worktree)

El contenido de HEAD se almacena en el interior de .git/HEAD y contiene el 40 bytes SHA-1 de la actual cometer.


detached HEAD

Si usted no está en el último commit - lo que significa que HEAD apunta a una antes de comprometerse en la historia de su llamado detached HEAD.

enter image description here

En la línea de comandos se parecerá a esto - SHA-1 en lugar de el nombre de la rama desde el HEAD no está apuntando a la de la punta de la rama actual

enter image description here


Algunas opciones sobre cómo recuperarse de un desprendimiento de la CABEZA:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Esto checkout nueva rama que apunta a la deseada cometer.
Este comando checkout para una confirmación.
En este punto usted puede crear una rama y empezar a trabajar desde este momento.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Siempre se puede utilizar la reflog así.
git reflog se muestra ningún cambio en el que se actualizan los HEAD y revisando el deseado reflog entrada se establece la HEAD de vuelta a este commit.

Cada vez que la CABEZA se modifica habrá una nueva entrada en el reflog

git reflog
git checkout HEAD@{...}

Esto te llevará de vuelta a su deseado cometer

enter image description here


git reset HEAD --hard <commit_id>

"Mover" su cabeza hacia atrás a la posición deseada cometer.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Nota:(Desde Git 2.7)
    también puede utilizar el git rebase --no-autostash así.


git revert <sha-1>

"Deshacer" la confirmación o cometer gama.
El reset comando "deshacer" los cambios realizados en la confirmación.
Un nuevo commit con el deshacer parche será muy comprometidos, mientras que el original cometer quedará en la historia como bien.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Este esquema se ilustran que comando lo hace.
Como puedes ver hay reset && checkout modificar el HEAD.

enter image description here

Sólo he hecho un hard reset en mal proyecto.Lo que me salvó la vida fue el Eclipse de la historia local.IntelliJ Idea se dice que tiene uno, demasiado, por lo que puede que su editor, es digno de la comprobación:

  1. Eclipse tema de ayuda sobre la Historia Local
  2. http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F

Hizo un pequeño script para hacer un poco más fácil la búsqueda de cometer uno está buscando:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'

Sí, puede ser mucho más guapa con awk o algo por el estilo, pero es muy simple y sólo necesitaba de ella.Podría salvar a alguien más de 30 segundos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top