tag - Git se compromete contra la etiqueta sin rama
¿qué hace git log-oneline? (4)
Sí, estarán en reflogs.
Puede nombrar la rama en cualquier momento como este:
git checkout -b my-branch-name
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?
Para responder a la segunda pregunta, usarías git reset --hard yourtagname
En cuanto a lo que sucedería, básicamente bifurcaste tu rama en el nombre de etiqueta y permaneciste 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.
Debido a que su confirmación no se encuentra en ninguna rama , no puede verla en el directorio de trabajo a menos que realice el pago de esa confirmación específica, utilizando su SHA1. Puede encontrar el compromiso mirando el reflog
que rastrea los cambios en lo que ha desprotegido del repositorio. Si tu etiqueta fue XXX
, verás algo como:
$ git reflog
7a30fd7... HEAD@{0}: checkout: moving from master to XXX
ddf751d... HEAD@{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master
96c3b03... HEAD@{2}: commit: example commit on tag XXX, not on any branch
7a30fd7... HEAD@{3}: checkout: moving from master to XXX
Eso le indica al SHA1 que tendría que checkout
para ver su confirmación 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 me pareció un poco extraño al principio, hasta que me di cuenta de que git checkout
coloca todos los archivos del proyecto a partir de un compromiso particular 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 se han sobrescrito en el repositorio , simplemente no se muestran en su directorio de trabajo cuando se ha revisado el maestro.
Alternativamente, puede fusionar la confirmación de nuevo en el maestro sin una nueva rama encontrando su SHA1 (usando git reflog como se indicó anteriormente) y luego:
git checkout master
git merge SHA1