Pregunta ¿Cómo puedo mover una etiqueta en una rama de git a una confirmación diferente?


Creé una etiqueta en la rama principal llamada v0.1 Me gusta esto:

git tag -a v0.1

Pero luego me di cuenta de que todavía había algunos cambios que necesitaba fusionar en el maestro para el lanzamiento 0.1, así que lo hice. Pero ahora mi v0.1 la etiqueta está bloqueada (para invocar la analogía de la nota post-it) la confirmación incorrecta. Quiero que se quede atascado en el compromiso más reciente en el maestro, pero en su lugar está atascado en el segundo compromiso más reciente en el maestro.

¿Cómo puedo moverlo a la confirmación más reciente en el maestro?


600
2017-11-08 00:32


origen


Respuestas:


Utilizar el -f opción de git tag:

-f
--force

    Replace an existing tag with the given name (instead of failing)

Probablemente quieras usar -f junto con -a para forzar a crear una etiqueta anotada en lugar de una etiqueta no anotada.

Ejemplo

  1. Borre la etiqueta en cualquier control remoto antes de presionar

    git push origin :refs/tags/<tagname>
    
  2. Reemplazar la etiqueta para hacer referencia a la confirmación más reciente

    git tag -fa <tagname>
    
  3. Empujar la etiqueta al origen remoto

    git push origin master --tags
    

830
2017-11-08 00:34



Más precisamente, debe forzar la adición de la etiqueta, luego presione con la opción --tags y -f:

git tag -f -a <tagname>
git push -f --tags

210
2018-01-15 00:40



Para resumir si se llama su control remoto origin y estás trabajando en master rama:

git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
  • La línea 1 elimina la etiqueta en env local.
  • La línea 2 elimina la etiqueta en env remoto.
  • La línea 3 agrega la etiqueta a diferentes compromisos
  • La línea 4 empuja el cambio al control remoto

También puede cambiar la línea 4 a git push origin --tags para impulsar todos los cambios con etiquetas de sus cambios locales.

Basándome en @ stuart-golodetz, @ greg-hewgill, @eedeep, @ ben-hocking respuestas, comentarios debajo de sus respuestas y comentarios de NateS debajo de mi respuesta.


95
2018-02-02 14:53



Eliminarlo con git tag -d <tagname> y luego recrébelo en la confirmación correcta.


79
2017-11-08 00:34



Alias ​​para mover una etiqueta a una confirmación diferente.

En tu muestra, para mover la confirmación con hash e2ea1639 hazlo: git tagm v0.1 e2ea1639.

Para etiquetas presionadas, use git tagmp v0.1 e2ea1639.

Ambos alias te mantienen la fecha y el mensaje originales. Si utiliza git tag -d Perdiste tu mensaje original.

Guárdalos en tu .gitconfig archivo

# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"

# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0}  }; END { print message }' | sed '$ d' | cat -s #"

### Move tag. Use: git tagm <tagname> <newcommit> 
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"

### Move pushed tag. Use: git tagmp <tagname> <newcommit> 
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"

5
2018-05-21 20:02



Dejaré aquí otra forma de este comando que se adapta a mis necesidades.
Había una etiqueta v0.0.1.2 que yo quería moverme

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

Y entonces:

$ git push --tags --force

5
2017-09-19 00:14



Otra forma:

Mueva la etiqueta en el repositorio remoto. (Reemplace HEAD con cualquier otro si es necesario).

$ git push --force origin HEAD:refs/tags/v0.0.1.2

Fetch cambia de nuevo.

$ git fetch --tags

1
2018-03-15 07:44