git - remove - Establecer la rama principal a la última etiqueta
git push tag (3)
Este es un ejemplo de cómo mi repositorio de git es ahora mismo:
v1.0 v1.1 v1.2 | | | a - b - c | | master HEAD
Por lo general, comprometo, etiqueto y envío etiquetas como esta:
git commit -a -m "Commit msg"
git tag -a v1.3 -m "Tag msg"
git push --tags
El principal problema que tengo es que la rama principal no se mueve a la última etiqueta, por lo que siempre estoy en un estado de HEAD Detached . ¿Hay alguna manera de arreglar esto para que la rama principal siempre apunte a la última etiqueta empujada?
Varias respuestas / comentarios ya dados sobre por qué no hacer las cosas de esta manera, pero así es cómo se soluciona este escenario en particular:
git checkout -b tmpbranch # creates a branch called tmpbranch at HEAD
git checkout master # switch back to master branch
git merge --ff-only tmpbranch # fast-forward merge master to tmpbranch, fail if not possible
git branch -d tmpbranch # delete tmpbranch, it''s not needed anymore
Luego, en el futuro, no revise una etiqueta, excepto por esta forma:
git checkout -b somebranch refs/tags/tagname # creates a new branch starting at tag
De esta manera, no estarás en el estado HEAD aislado, y se agregarán nuevos commits a partir de la etiqueta en cuestión, que parece ser lo que quieres ... Después de hacer una confirmación puedes git tag newtag
para crear etiquetas adicionales en los puntos correctos.
En este caso particular, tuve que hacer lo siguiente:
1) Primero configure la rama principal para que apunte a la última etiqueta (a la que apunta HEAD), porque es la etiqueta más reciente. Para hacerlo, creé una nueva rama y fusioné el maestro.
git branch -b exp
git merge -s ours master
git checkout master
git merge exp
Ahora maestro es lo mismo que la última etiqueta:
v1.0 v1.1 v1.2
| | |
a - b - c
|
HEAD
|
master
2) Una vez que tengamos el master de nuevo en su lugar, necesitamos enviar tanto el maestro como las etiquetas cada vez que hagamos una nueva confirmación:
git commit -a -m "Commit msg"
git tag -a v1.4 -m "Tag msg"
git push master --tags
De esta forma evitamos estar en un modo HEAD separado y la rama principal se actualiza.
Una rama no hace referencia a una etiqueta.
Una etiqueta hace referencia a una confirmación fija .
Por lo tanto, siempre y cuando git checkout master
, no se encuentra en modo HEAD desconectado .
A continuación, puede confirmar y etiquetar: la etiqueta se creará en ÚLTIMA VEZ de la rama actual.
Si estaba en un modo HEAD desconectado, consulte " Git: ¿Cómo puedo reconciliar el HEAD
separado con el master/origin
? " Para obtener varias formas de reconciliar un commit separado con una rama.