2012-04-02 11 views
103

Esto es lo que sucedió:¿Qué sucede con las confirmaciones de git creadas en un estado HEAD aislado?

Tengo una rama A. En la rama A cometí un montón de cambios. No estaba contento con el código, así que revisé la confirmación anterior en la rama A. Luego hice un montón más de cambios y los ingresé en la rama A. Ahora no puedo encontrar esta confirmación en ninguna parte. ¿Perdí este código?

+0

Cuando dices "Revisé la confirmación anterior en la rama A", ¿te refieres a "reiniciar la rama A a la confirmación anterior"? es decir, ¿de hecho 'git reset' en lugar de' git checkout'? –

+0

No, utilicé el pago y envío. Reflog funcionó. – Mausimo

+0

Si utilizó el proceso de pago, habrá estado en un 'HEAD' separado y la rama A se habría quedado en la confirmación anterior. Exactamente, ¿qué comandos ejecutó? –

Respuesta

141

La confirmación anterior aún está en el reflog.

git reflog 

Esto mostrará una lista de confirmaciones, y la confirmación "perdida" debería estar ahí. Puedes convertirlo en una nueva rama. Por ejemplo, si el SHA-1 es ba5a739, entonces usted puede hacer una nueva rama llamada "nueva rama" en el viejo comprometerse con:

git branch new-branch ba5a739 

Tenga en cuenta que "perdieron" commit se se eliminan cuando la base de datos es podado

+8

Gracias, esto funcionó. Es bueno saberlo, pensé que todo estaba perdido. – Mausimo

+0

Hice lo mismo y tuve un ataque al corazón pensando que se había perdido. Gracias por la info! – Chausser

+9

Use 'git cherry-picking [SHA]' para mover la confirmación a una rama existente en caso de que se haya cometido accidentalmente en un estado de cabecera separado –

4

No lo perdió, Git todavía conserva una copia (pero actualmente no se puede acceder por ningún cabezal). Puede encontrar la confirmación que falta utilizando el comando git reflog. El reflog realiza un seguimiento de las posiciones históricas de un encabezado de bifurcación, y puede usarlo para encontrar cosas a las que apuntaba el ramal.

4

El parlamento de Git para el estado de su directorio de trabajo es un “ detached HEAD. ” Aquí hay otro lugar donde git reflog realiza el guardado.

$ git reflog 
0b40dd6 [email protected]{0}: commit: my commit on detached HEAD 
... 

Si trato de pagar una rama diferente, git-1.7.5.1 da una sugerencia útil.

$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to 
any of your branches: 

    0b40dd6 my commit on detached HEAD 

If you want to keep them by creating a new branch, this may be a good time 
to do so with: 

git branch new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b 

Switched to branch 'master'
+0

Gracias por la información y el enlace. El enlace me ayudó a entender lo que estaba sucediendo. – Mausimo

+0

Presentación de diapositivas muy útil. La url se ha movido, así que lo actualizaré. – miva2

41

Sus confirmaciones aún están disponibles en el reflog, como se señaló anteriormente. Además de las otras respuestas, aquí es una manera de hacerse cargo de la cabeza separada se compromete en su rama actual directamente, sin necesidad de crear y la fusión de una nueva rama:

  1. Busque los hash SHA-1 de la se compromete usted hizo en el estado de cabeza separada con

    git reflog 
    
  2. luego ejecutar, con todos los valores hash cometer ordenados del más antiguo al más reciente:

    git cherry-pick <hash1> <hash2> <hash3> ... 
    

    Por ejemplo, si tuviera sólo uno, dada en los "primeros 7 caracteres" formato de hash corto:

    git cherry-pick a21d053 
    

Esto creará un nuevo comprometerse con su rama actual (uno por cada cabeza separada-commit que mencionas en el comando). También toma el control de los mensajes de confirmación originales.

1

En Sourcetree, encontré que el git reflog no funcionaba, así que descubrí cómo hacerlo usando la GUI.

Primero, intente encontrar la confirmación "perdida" buscando un mensaje en el Historial de Comandos (ver: Mostrar Salida de Comando). Esperemos que esté en el comando "Switching Branch" después del commit que ha perdido y verá el comentario de commit con un ID de commit 1234567.

Lleve esa confirmación de compromiso al siguiente paso.

Pulse el botón "Sucursal" en la barra de herramientas superior y debe obtener un cuadro de diálogo "Nueva sucursal" donde puede especificar una determinada confirmación. Ponga ese ID de compromiso allí, especifique un nuevo nombre de rama, pulse Crear rama y ¡debería obtener una nueva rama con su confirmación perdida!

¡Esto me devolvió algo de trabajo perdido!

7

Usted puede encontrar perdido (colgando) comete con el siguiente comando:

git fsck --lost-found 

Nota, si su jefe actual está colgando cometer, no se aparece como perdido.

Usted puede encontrar más información en git-fsck(1) Manual Page

A continuación, puede crear rama sobre la que Lost se comprometen:

git branch new-branch ba5a739 
+0

Primero utilicé el comando "git reflog" y luego "git branch new-branch ba5a739" para un submódulo, funcionó. – ondermerol

1

Siga estos pasos para vincular la cabeza desprendida de nuevo al repositorio git

  1. git checkout "your branch with path but without remote name"

p. si el nombre remoto es origen y nombre de la sucursal es bugfix/somebranch a continuación, utilizar git checkout bugfix/somebranch

  1. git reflog obtener la confirmación de SHA figuran a partir de lista de confirmación de la rama individual.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

TODO LISTO !!

Cuestiones relacionadas