tag remove practices crear commits commands best git git-tag

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



git tag commits (9)

Creé una etiqueta en la rama maestra llamada v0.1 como esta:

git tag -a v0.1

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

¿Cómo puedo moverlo al commit más reciente en master?


Alias ​​para mover una etiqueta a un commit diferente.

En su muestra, para mover commit con hash e2ea1639, haga: git tagm v0.1 e2ea1639 .

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

Ambos alias te mantienen fecha y mensaje originales. Si usas git tag -d perdiste tu mensaje original.

Guárdalos en tu archivo .gitconfig

# 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 #"


De otra manera:

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

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

Recupera los cambios.

$ git fetch --tags


Dejaré aquí solo otra forma de este comando que se ajuste a mis necesidades.
Había una etiqueta v0.0.1.2 que quería mover.

$ git tag -f v0.0.1.2 63eff6a Updated tag ''v0.0.1.2'' (was 8078562)

Y entonces:

$ git push --tags --force


Intento evitar un par de cosas cuando uso Git.

  1. Uso del conocimiento de los aspectos internos, por ejemplo, refs / tags. Intento usar únicamente los comandos de Git documentados y evito usar cosas que requieran conocimiento de los contenidos internos del directorio .git. (Es decir, trato a Git como usuario de Git y no como desarrollador de Git).

  2. Evite el uso de la fuerza cuando no sea necesario.

Así que aquí está mi solución no violenta para cambiar una etiqueta, tanto local como remotamente, sin el conocimiento de los componentes internos de Git.

Lo uso cuando una solución de software tiene un problema y necesita ser actualizado / relanzado.

git tag -d fix123; # delete the old local tag git push github :fix123 # delete the old remote tag (use for each remote) git tag fix123 790a621265 # create a new local tag git push github fix123 # push new tag to remote (use for each remote)

github es un nombre remoto de muestra, fix123 es un nombre de etiqueta de muestra y 790a621265 una confirmación de muestra.


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

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


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

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 remota.
  • La línea 3 agrega la etiqueta a diferentes confirmaciones.
  • La línea 4 empuja el cambio al control remoto.

También puede intercambiar 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.


Si desea mover una etiqueta anotada, cambie solo la confirmación dirigida pero conservando el mensaje de anotación y el uso de otros metadatos:

moveTag() { local tagName=$1 # Support passing branch/tag names (not just full commit hashes) local newTarget=$(git rev-parse $2^{commit}) git cat-file -p refs/tags/$tagName | sed "1 s/^object .*$/object $newTarget/g" | git hash-object -w --stdin -t tag | xargs -I {} git update-ref refs/tags/$tagName {} }

uso: moveTag <tag-to-move> <target>

La función anterior fue desarrollada haciendo referencia a teerapap/git-move-annotated-tag.sh .


Use la opción -f para git tag :

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

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

Ejemplo

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

    git push origin :refs/tags/<tagname>

  2. Reemplace la etiqueta para hacer referencia a la confirmación más reciente

    git tag -fa <tagname>

  3. Empuje la etiqueta al origen remoto

    git push origin master --tags


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