1196 votes

Comment déplacer un tag sur une branche git vers un commit différent ?

J'ai créé un tag sur la branche master appelé v0.1 comme ça :

git tag -a v0.1

Mais j'ai ensuite réalisé qu'il y avait encore des changements que je devais fusionner dans master pour la version 0.1, donc je l'ai fait. Mais maintenant mon v0.1 est bloqué sur (pour invoquer l'analogie du post-it) le mauvais commit. Je veux qu'il soit bloqué sur le commit le plus récent de master, mais au lieu de cela il est bloqué sur le deuxième commit le plus récent de master.

Comment puis-je le déplacer vers le commit le plus récent sur master ?

59voto

Nakilon Points 11635

Je laisserai ici une autre forme de cette commande qui répondait à mes besoins.
Il y avait une étiquette v0.0.1.2 que je voulais bouger.

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

Et puis :

$ git push --tags --force

4 votes

Cela a fonctionné et c'est la réponse la plus simple. Merci !

17voto

Alias pour déplacer un tag vers un commit différent.

Dans votre exemple, pour déplacer le commit avec le hash e2ea1639, faites : git tagm v0.1 e2ea1639 .

Pour les balises poussées, utilisez git tagmp v0.1 e2ea1639 .

Les deux alias conservent la date et le message originaux. Si vous utilisez git tag -d vous avez perdu votre message original.

Enregistrez-les sur votre .gitconfig fichier

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

14voto

D'une autre manière :

Déplacer le tag dans le repo distant (remplacer HEAD par un autre si nécessaire).

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

Récupérer les modifications.

$ git fetch --tags

1 votes

Cette réponse est plus "transactionnelle" que les autres.

6voto

Si vous utilisez github et que vous souhaitez modifier le commit d'une release (par exemple, si vous constatez que vous ne commettez pas quelque chose après avoir créé la release), vous pouvez utiliser la méthode suivante

git push origin :refs/tags/<tagname>

Après cette commande, github supprime votre étiquette et votre version devient un brouillon. Cela signifie que vous pouvez recréer la version et sélectionner commit. Vos fichiers et votre message seront sauvegardés.

1voto

vossad01 Points 1568

Si vous souhaitez déplacer une balise annotée, en ne modifiant que le commit ciblé mais en préservant le message d'annotation et les autres métadonnées utilisées :

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 {}
}

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

La fonction ci-dessus a été développée en référençant teerapap/git-move-annotated-tag.sh .

2 votes

Il semble que cela ne soit plus nécessaire : git tag -f -a my_tag préserve déjà le message d'un message précédent (avec la version 2.11.0 de git).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X