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 ?

1597voto

Greg Hewgill Points 356191

Utilisez le -f option pour git tag :

-f
--force

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

Vous voulez probablement utiliser -f en collaboration avec -a pour forcer la création d'une balise annotée au lieu d'une balise non annotée.

Exemple

  1. Supprimez le tag de n'importe quelle télécommande avant de pousser

    git push origin :refs/tags/<tagname>
  2. Remplacer le tag pour référencer le commit le plus récent

    git tag -fa <tagname>
  3. Pousser l'étiquette vers l'origine distante

    git push origin master --tags

27 votes

Cela ne fonctionne que si vous n'avez pas poussé le code hors de votre machine. Si vous l'avez fait, la meilleure réponse est "il y a beaucoup de chiffres dans le monde" car cela ne vaut probablement pas la peine de s'embêter.

75 votes

Si vous avez déjà poussé votre balise, vous pouvez toujours mettre à jour la balise distante avec une poussée forcée. git push -f origin <tagname>

4 votes

Il n'est pas nécessaire d'utiliser la fonction de poussée forcée si la référence de la balise peut être transférée rapidement vers le nouvel emplacement.

415voto

Vive Points 562

En résumé, si votre télécommande s'appelle origin et vous travaillez sur master branche :

git tag -d <tagname>                  # delete the old tag locally
git push origin :refs/tags/<tagname>  # delete the old tag remotely
git tag <tagname> <commitId>          # make a new tag locally
git push origin <tagname>             # push the new local tag to the remote 

Description :

  • La ligne 1 supprime la balise dans l'environnement local.
  • La ligne 2 supprime la balise dans l'environnement distant.
  • La ligne 3 ajoute le tag à différents commit
  • La ligne 4 pousse le changement vers le distant

Vous pouvez également changer la ligne 4 en git push origin --tags pour pousser toutes les modifications/mises à jour de vos balises locales vers le dépôt distant.

La réponse ci-dessus est basée sur le contenu de la question de @eedeep, ainsi que sur les réponses de Stuart Golodetz , Greg Hewgill et @ben-hocking, et les commentaires sous leurs réponses, et les commentaires originaux de @NateS sous ma réponse.

2 votes

La ligne 4 fonctionne pour pousser un simple la balise mise à jour vers le référentiel distant, au cas où vous ne voudriez pas mettre à jour toutes les balises, comme je ne l'ai pas fait.

350voto

Daniel Points 290

Plus précisément, vous devez forcer l'ajout de la balise, puis pousser avec l'option --tags et -f :

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

4 votes

Cette réponse a complété la réponse acceptée en incluant -f pour pousser les étiquettes.

4 votes

Si vous ne souhaitez pas ajouter de commentaire, omettez l'élément -a .

105voto

Stuart Golodetz Points 12679

Supprimez-la avec git tag -d <tagname> et ensuite le recréer sur le bon commit.

3 votes

@eedeep : Je pense que la réponse de Greg est en fait meilleure ici pour être juste.

1 votes

Faites simple. Supprimez-le, refaites ce que vous avez fait avant.

4 votes

Cela devrait être la réponse acceptée, pour sa simplicité. Elle n'utilise pas non plus la force -f de manière excessive.

96voto

user3070485 Points 11

J'essaie d'éviter certaines choses lorsque j'utilise Git.

  1. Utilisation de la connaissance des internes, par exemple les refs/tags. J'essaie d'utiliser uniquement les commandes Git documentées et j'évite d'utiliser des choses qui nécessitent une connaissance du contenu interne du répertoire .git. (En d'autres termes, je traite Git comme un utilisateur de Git et non comme un développeur de Git).

  2. L'utilisation de la force quand elle n'est pas nécessaire.

  3. Faire trop de choses. (Pousser une branche et/ou beaucoup d'étiquettes, pour obtenir une étiquette où je veux).

Voici donc ma solution non violente pour modifier une balise, à la fois localement et à distance, sans connaissance des mécanismes internes de Git.

Je l'utilise lorsqu'une correction logicielle a finalement un problème et doit être mise à jour/publiée.

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

github est un exemple de nom distant, fix123 est un exemple de nom de balise, et 790a621265 un exemple d'engagement.

0 votes

Je pense que le tag de l'OP était annoté. La troisième ligne pourrait être comme ceci à la place git tag -a fix123 790a621265 # create a new local, annotaged tag

1 votes

Je déteste que ce soit la meilleure réponse. Je me demande pourquoi cela doit être si compliqué ? Les balises sont bien adaptées pour marquer quel commit est pour la production, donc j'ai besoin de changer le commit sur lequel elles sont attachées assez souvent. Utiliser une branche que vous rebasez tout le temps est actuellement plus facile, mais c'est redondant lorsque l'environnement n'est pas concerné par le contenu de votre dépôt (ce qui vaut la peine d'être recherché).

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