Comment baliser un commit plus ancien dans Git?

949

Nous sommes nouveaux dans git, et je veux définir une balise au début de notre référentiel. Notre code de production est le même que le dépôt de départ, mais nous avons effectué des commits depuis lors. Une balise au début nous permettrait de "faire reculer" la production à un état stable connu.

Alors, comment ajouter une balise à un commit arbitraire et plus ancien?

hogsolo
la source
Je suis venu ici à la recherche d'aide pour supprimer une ancienne balise localement et sur une télécommande et j'ai finalement trouvé cela utile, peut-être que cela aidera aussi quelqu'un d'autre: gist.github.com/mobilemind/7883996
Aleksander Lidtke
1
Et n'oubliez pas Comment pousser une balise vers un référentiel distant en utilisant Git? parce que Git ne poussera pas une balise sans faire quelque chose de spécial.
2018

Réponses:

1511

Exemple:

git tag -a v1.2 9fceb02 -m "Message here"

Où se 9fceb02trouve la première partie de l'ID de validation.

Vous pouvez ensuite pousser la balise à l'aide de git push origin v1.2.

Vous pouvez faire git logpour afficher tous les ID de validation dans votre branche actuelle.

Il y a aussi un bon chapitre sur le balisage dans le livre Pro Git.

Avertissement: cela crée des balises avec la date actuelle (et cette valeur est ce qui s'affichera sur une page de versions de GitHub, par exemple). Si vous souhaitez que la balise soit datée de la date de validation, veuillez consulter une autre réponse .

dkinzer
la source
45
Vous pouvez également le faire dans le menu contextuel de gitk - pratique si c'est ainsi que vous trouvez le SHA1 de toute façon.
Cascabel
62
Omettez la -aet les -m "Message here"parties si vous ne voulez pas ajouter de message:git tag v1.2 9fceb02
devius
3
Vous pouvez également utiliser l'ID de validation complet.
j08lue
1
@devius Quelle est la différence entre l'utilisation de -aet -m. La page de manuel semble indiquer qu'elle -aest implicite lorsqu'elle -mest utilisée.
John Strood
7
git push --tags origin masterpousserait toutes les balises de la branche locale à distance. Préférez git push origin <tag_name>simplement pousser la balise créée. Voir: stackoverflow.com/a/5195913/452708 , git-scm.com/book/en/v2/Git-Basics-Tagging
Abhijeet
144

Juste le code

# Set the HEAD to the old commit that we want to tag
git checkout 9fceb02

# temporarily set the date to the date of the HEAD commit, and add the tag
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" \
git tag -a v1.2 -m"v1.2"

# set HEAD back to whatever you want it to be
git checkout master

Détails

La réponse de @dkinzer crée des balises dont la date est la date actuelle (lorsque vous avez exécuté la git tagcommande), et non la date de la validation. L'aide de Git tagcontient une section "Sur les balises antidatées" qui dit:

Si vous avez importé des modifications à partir d'un autre VCS et souhaitez ajouter des balises pour les versions majeures de votre travail, il est utile de pouvoir spécifier la date à incorporer à l'intérieur de l'objet balise; ces données dans l'objet tag affectent, par exemple, l'ordre des tags dans l'interface gitweb.

Pour définir la date utilisée dans les futurs objets de balise, définissez la variable d'environnement GIT_COMMITTER_DATE(voir la discussion ultérieure des valeurs possibles; la forme la plus courante est "AAAA-MM-JJ HH: MM").

Par exemple:

$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1

La page "Comment baliser dans Git" nous montre que nous pouvons extraire l'heure du commit HEAD via:

git show --format=%aD  | head -1
#=> Wed, 12 Feb 2014 12:36:47 -0700

Nous pourrions extraire la date d'un commit spécifique via:

GIT_COMMITTER_DATE="$(git show 9fceb02 --format=%aD | head -1)" \
git tag -a v1.2 9fceb02 -m "v1.2"

Cependant, au lieu de répéter le commit deux fois, il semble plus facile de simplement changer le HEAD en ce commit et de l'utiliser implicitement dans les deux commandes:

git checkout 9fceb02 

GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a v1.2 -m "v1.2"
Phrogz
la source
4
@ColonelPanic, votre souhait est ma commande! github.com/lucasrangit/git-custom-commands/blob/master/…
Lucas
Si vous utilisez Github pour gérer les versions et vous soucier de la date indiquée sur la page / tags de votre projet, définir le GIT_COMMITTER_DATE est particulièrement important!
Lesley
2
@ColonelPanic Je vous ai donné un vote positif pour le jeu de mots, et j'aimerais pouvoir vous en donner un deuxième pour le code, mais une star de github devra le faire.
andyhasit
96

La façon la plus simple de le faire est:

git tag v1.0.0 f4ba1fc

avec f4ba1fcêtre le début du hachage du commit que vous voulez étiquette et v1.0.0être la version que vous souhaitez marquer.

PatrickNLT
la source
Parfait merci :).
Saleh Enam Shohag
36

OK , vous pouvez simplement faire:

git tag -a <tag> <commit-hash>

Donc, si vous voulez ajouter la balise: 1.0.2 pour valider e50f795, faites simplement:

git tag -a 1.0.2 e50f795

Vous ajoutez également un message à la fin, en utilisant -mquelque chose comme ceci:

git tag -a 1.0.2 e50f795 -m "my message"

Après tout, vous devez le pousser vers le remote, pour ce faire, faites simplement:

git push origin 1.0.2 

Si vous avez plusieurs balises que vous ne voulez pas mentionner une par une, faites simplement:

git push origin --tags

pour regrouper toutes les balises ...

De plus, j'ai créé les étapes dans l'image ci-dessous, pour plus de clarification des étapes: création d'une balise sur un hachage de validation

Vous pouvez également dd le tag dans Hub ou en utilisant des outils comme SourceTree , pour éviter les étapes précédentes, je me suis connecté à mon Bitbucket dans ce cas et je le fais à partir de là:

  1. Accédez à votre succursale et recherchez le commit auquel vous souhaitez ajouter le tag et cliquez dessus:

trouvez votre commit dans bitbucket

  1. Dans la page de validation , à droite, trouvez où il est écrit No tagset cliquez sur l' +icône:

trouver où il est écrit Pas de balises

  1. Dans la zone du nom du tag, ajoutez votre tag:

ajouter un nom de balise

  1. Vous voyez maintenant que la balise a réussi à créer:

entrez la description de l'image ici

Alireza
la source
11

C'est une vieille question, et les réponses ont déjà donné tout le travail, mais il y a aussi une nouvelle option qui peut être envisagée.

Si vous utilisez SourceTree pour gérer vos référentiels git, vous pouvez cliquer avec le bouton droit sur n'importe quel commit et y ajouter une balise. Avec un autre clic de souris, vous pouvez également envoyer le tag directement à la branche d'origine.

Stephan Bijzitter
la source
6

S'appuyant sur les réponses des autres, voici une solution à une ligne qui définit la date de la balise au moment où elle s'est réellement produite, utilise la balise annotée et ne nécessite pas git checkout:

tag="v0.1.3" commit="8f33a878" bash -c 'GIT_COMMITTER_DATE="$(git show --format=%aD $commit)" git tag -a $tag -m $tag $commit'
git push --tags origin master

tagest défini sur la chaîne de balise souhaitée et commitsur le hachage de validation.

stason
la source
3

La réponse de @Phrogz est excellente, mais ne fonctionne pas sous Windows. Voici comment marquer un ancien commit avec la date d'origine du commit à l'aide de Powershell:

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master
ccoxtn
la source