2008-12-14 9 views
56

Si reviso una versión etiquetada de mi código fuente sin crear una rama, Git indica que no estoy asociado con ninguna rama. Sin embargo, me complace permitirme hacer cambios y registrarlos. ¿A dónde van esos cambios? Si cambio a 'master' desaparecen (sobrescritos por lo que estaba en el master) y parece que no puedo volver a encontrarlos. ¿Lo que da? Si Git me permite realizar cambios contra lo que es esencialmente una rama anónima, ¿puedo recuperarlos?Git commit against tag sin rama

Respuesta

79

Debido a que su confirmar no está en ninguna rama, no se puede ver en el directorio de trabajo a menos que usted la comprobación de que se comprometan específica , usando su SHA1. Puede encontrar el compromiso mirando el reflog que rastrea los cambios en lo que ha desprotegido del repositorio. Si la etiqueta era XXX verá algo como:

$ git reflog 
7a30fd7... [email protected]{0}: checkout: moving from master to XXX 
ddf751d... [email protected]{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master 
96c3b03... [email protected]{2}: commit: example commit on tag XXX, not on any branch 
7a30fd7... [email protected]{3}: checkout: moving from master to XXX 

que le indica el SHA1 que tendría que checkout con el fin de ver a su cometen en el directorio de trabajo.

$ git checkout 96c3b03 
Note: moving to "96c3b03" which isn't a local branch 
If you want to create a new branch from this checkout, you may do so 
(now or later) by using -b with the checkout command again. Example: 
    git checkout -b <new_branch_name> 
HEAD is now at 96c3b03... example commit on tag XXX, not on any branch 
$ git checkout -b newbranch 
$ git branch    #lists all branches 
    feature1 
    master 
    * newbranch 

Todo esto parecía un poco raro para mí al principio, hasta que me di cuenta de que git checkout coloca todos los archivos de proyecto como de un particular, se comprometen en mi sistema de archivos (directorio de trabajo). En efecto, el directorio de trabajo actúa como un navegador en el repositorio local de Git. Por lo tanto, sus cambios no han sido sobrescritos en el repositorio, simplemente no se muestran en su directorio de trabajo cuando ha revisado el maestro.

+1

Nota mental: A continuación, hacer checkout master ' 'git, 'git merge newbranch',' git branch -d newbranch' y 'git push'. – Znarkus

+1

O incluso simplier sin crear una rama: 'git checkout master' y luego' git merge 96c3b03' (reemplace con el SHA1 correcto encontrado por 'git reflog'') (como la solución de [gjvis bramido] (http://stackoverflow.com)/a/8760749/535203)) –

9

Sí, estarán en reflogs.

Se puede nombrar a la rama en cualquier momento como este:

git checkout -b my-branch-name 
0

Para responder a la segunda pregunta que tendría que utilizar git restablecer yourtagname --hard

En cuanto a lo que sucedería en forma de horquilla que esencialmente su sucursal en el nombre de etiqueta y se quedó en la misma rama. Tus compromisos en el tenedor viejo siguen ahí ... son difíciles de ver. Puede que tenga que usar el reflog para encontrar el tenedor viejo.

5

Alternativamente, puede combinar el envío de datos de nuevo en maestro sin una nueva rama encontrando su SHA1 (usando git reflog que el anterior) y luego:

git checkout master 
git merge SHA1