git - tag - Mover la etiqueta uno cometer adelante
¿qué hace git log-oneline? (2)
Tengo un repositorio con una sola rama ( master
). Soy el único contribuyente a mi repo.
Recientemente agregué una tag
, tanto localmente como empujada a GitHub. Después de hacer lo que pensé, fue el último compromiso necesario, pero ahora me doy cuenta de que debería haber realizado un cambio / compromiso más.
Entonces lo que tengo es:
commit 124
commit 125
commit 126 <-- tag v1.0
commit 127
y quiero mover la etiqueta v1.0
a la siguiente confirmación, es decir: 127
, tanto localmente como en GitHub.
¿Cómo puedo hacer eso?
¿Alguna vez has estado en un club de libros donde los miembros no usan la misma edición del "libro de la semana"? Es una pesadilla, ¿verdad? Mover una etiqueta esencialmente te pondría en la misma situación.
Si piensa en su repositorio como un libro que narra el progreso de su proyecto, puede pensar en una etiqueta como el encabezado de un capítulo .
Mover una etiqueta a una confirmación diferente después de compartirla es como contarle a todos tus amigos del club de libros
¿Sabes qué, chicos? La edición del libro que todos hemos estado usando hasta ahora está obsoleta, porque únicamente he decretado que el capítulo 8 comenzará ahora, no en la página 126, sino en la página 128.
No está bien. Mover una etiqueta es una forma de reescritura de historial, y no debe volver a escribir el historial que se ha compartido. Es la forma más segura de molestar a tus colaboradores. Además, tu escribes
Soy el único contribuyente a mi repositorio [...]
Eso puede ser cierto por ahora, pero si otras personas además de usted tienen acceso a su repositorio GitHub (por ejemplo, si es público), es posible que algunas de ellas ya lo hayan clonado o clonado (aunque hay una way de averiguarlo), y usted corre el riesgo de hacerles enojar si reescribe la historia.
Si está 100% seguro de que quiere mover esa etiqueta de todos modos, Git le permite hacerlo. Aquí, podrías usar
git tag --force v1.0 <ID-of-commit-127>
y entonces tendrías que forzar empujar esa etiqueta, usando
git push --force --tags
Pero, de nuevo, piénselo dos veces antes de seguir adelante ...
Adición (2018/09/26)
Siento la necesidad de volver a visitar mi respuesta ...
Con los años, algunas personas han objetado en los comentarios a mi mandato de no mover una etiqueta ya publicada. Por supuesto, este consejo es más contextual que universal; No dudo que existan buenos casos para mover una etiqueta publicada. Sin embargo, me mantengo firme en la creencia de que, como regla general, la decisión de mover una etiqueta publicada se debe tomar deliberadamente y con extremo cuidado.
Un ejemplo reciente viene a la mente. Go 1.11 añadió soporte experimental para un sistema de módulo que depende en gran medida de las etiquetas Git para el control de versiones. Mover una etiqueta en el módulo Go que se ha publicado (en GitHub, por ejemplo) tendría consecuencias desastrosas.
Al hacerlo, rompería el contrato establecido entre usted (el autor del módulo) y sus usuarios (aquellos que dependen de su módulo), ya que negaría las garantías que el sistema de módulos de Go pretende proporcionar:
Los módulos registran requisitos de dependencia precisos y crean construcciones reproducibles.
Esa es una manera segura de molestar a la gente.
Este ejemplo puede ser suficiente para convencerlo de que, al menos en algunos casos, no debe mover etiquetas publicadas sin pensar. Yo descanso mi caso.
Generalmente, se desaconseja mover etiquetas ya que puede causar problemas debido a la naturaleza altamente distribuida de Git. Considerar:
-
abcd123
etiquetav1.0
en commitabcd123
- Tu amigo, llámalo Fred, busca
- Fred ahora tiene una etiqueta
v1.0
local enabcd123
- Mueve la etiqueta
v1.0
para cometercccc222
y presiona - Las siguientes cosas pueden suceder:
- Fred busca, pero la etiqueta
v1.0
en el servidor no coincide con su etiquetav1.0
local, por lo que Fred tiene que arreglar manualmente este conflicto, a pesar de que no hizo nada para provocarlo. - Fred presiona con la opción
--tags
para agregar una nuevasome-tag
que creó; este empuje es rechazado por el servidor porque su etiquetav1.0
local y la etiquetav1.0
del servidor no están de acuerdo
- Fred busca, pero la etiqueta
Con más de dos desarrolladores esto se vuelve mucho más complicado; Si incluso una persona no da el paso de actualizar su etiqueta local, puede obtener problemas en el futuro .
Si aún está seguro de que desea mover la etiqueta (tal vez se trate de un proyecto de un solo desarrollador, o de lo contrario está seguro de que nadie ha buscado la etiqueta o está preparado para comunicarse con todos los demás desarrolladores y asegurarse de que actualizan sus etiquetas locales) puedes hacer algo como esto:
git tag -a -f v1.0 <new-commit-hash>
git push --tags --force
Se debe alentar a otros desarrolladores a que eliminen su copia local de la etiqueta y busquen la nueva:
git tag -d v1.0
git fetch --tags