Supposons que le journal actuel dans mon gerrit ressemble à ceci:
Mon objectif est de créer une nouvelle balise (v1.73.0) qui devrait contenir commit8 et commit9 et la pousser vers Origin. On m'a dit de créer une nouvelle branche locale basée sur la dernière balise stable et de choisir les commits nécessaires et de la baliser. Cependant, j'ai du mal à pousser la balise à master.
Voici ce que j'ai fait:
... alors maintenant, comment puis-je pousser la v1.73.0 vers le master?
Résultat:
Dans git, chaque balise est dite "pointer vers" un (un, un) commit. En fait, il en va de même pour une branche: un nom de branche aussi ne pointe que sur un commit.
Ce qui fait que ce travail est deux choses:
Ainsi, la principale différence entre une branche et une balise est qu'une balise ne bouge pas.
Pour voir comment cela fonctionne, considérez un référentiel git simple avec seulement trois validations. Étiquetons ces commits A
, B
et C
. Le premier commit (A
) ne pointe vers rien, car c'est le premier commit, et la branche master
pointe vers A
:
A <-- master
Lorsque vous effectuez le deuxième commit, git crée B
pointant vers A
et avance le nom de la branche pour pointer vers B
:
A <- B <-- master
Ensuite, lorsque vous effectuez un troisième commit, git le fait à nouveau pointer vers son commit parent et avance la branche:
A <- B <- C <-- master
Si vous créez une balise maintenant, cette balise pointera, par défaut, pour valider C
:
A <- B <- C <-- master
^
|
tag: sometag
Si vous effectuez ensuite un nouveau commit D
, git avance le branch, mais pas le tag:
A <- B <- C <- D <-- master
^
|
tag: sometag
Vous pouvez, à tout moment, créer ou supprimer toute balise pointant vers un commit particulier:
$ git tag -d sometag
supprimera la balise sometag
, après quoi:
$ git tag sometag master~2
ajoutera sometag
pointant pour valider B
.1
(Nous venons de prouver qu'une balise peut se déplacer. La vraie différence est que les balises ne sont pas attendues à se déplacer, tandis que les branches le sont; et git ne déplace pas les balises automatiquement .2 On s'attend généralement à ce que les branches se déplacent dans une direction "en avant", c'est-à-dire si master
pointait pour valider C
et pointe maintenant pour valider D
, valider C
devrait généralement être trouvé en commençant par D
et en travaillant en arrière. Chaque fois que vous déplacez une branche pour que cette règle soit violée, vous "réécrivez l'historique"; voir d'autres articles pour savoir quand cela va bien et quand cela cause des problèmes aux gens.)
Lorsque vous utilisez git Push
, ce que vous faites réellement, c'est de demander à un autre référentiel git de prendre tous les nouveaux commits que vous n'avez pas, puis de définir un ou plusieurs noms - généralement des branches et/ou des balises - pour pointer vers certains commits ( un chacun) dans la collection résultante.3 Ces noms (branches, balises, etc.) sont appelés "références" en général, mais utilisons simplement "branche" et "balise" pour l'instant.
L'argument après git Push
nomme le référentiel (généralement via un nom "distant", comme Origin
) vers Push-to. Si vous ne le laissez pas, git essaiera d'en trouver un, mais si vous souhaitez ajouter un nom de branche ou de balise, vous devez l'inclure explicitement, car le premier mot ici est supposé être le nom distant. (C'est, git Push master
essaie d'utiliser master
comme nom distant plutôt que comme nom de branche.)
Pour pousser tous vos tags, vous pouvez simplement ajouter --tags
à ton git Push
commande:
git Push --tags Origin
Pour pousser une balise spécifique, vous pouvez la nommer:
git Push Origin sometag
tout comme vous pouvez pousser une branche spécifique:
git Push Origin master
(En fait, ce quatrième argument est un paire de noms, comme master:master
ou sometag:sometag
, mais il utilise par défaut le même nom des deux côtés dans la plupart des cas.4)
Vous pouvez omettre le nom Origin
si vous n'en avez pas besoin pour faire tous les arguments, par exemple, git Push --tags
est le même que git Push --tags Origin
(en supposant que toutes vos poussées vont à Origin
, de toute façon).
Pour définir une balise dans la télécommande, définissez-la d'abord localement, avec git tag namecommit-identifier
. Utilisez le visualiseur de votre choix pour vous assurer qu'il est correctement configuré. Poussez-le ensuite, avec git Push Origin name
ou git Push --tags
.
1Le master~2
la syntaxe demande à git de démarrer au commit trouvé via master
, puis de sauvegarder deux étapes. Vous pouvez à la place écrire le SHA-1 brut pour commit B
ici.
2Les anciennes versions de git (pré 1.8.4) appliquaient accidentellement des règles de branchement aux balises lors de la poussée (du côté distant, c'est-à-dire qu'elles laissaient une balise se déplacer s'il s'agissait d'une "avance rapide").
3Dans certains cas, vous pouvez pointer un nom vers une "balise annotée", et rien n'empêche un nom de pointer vers un objet "arbre" ou "blob" non plus, mais ce n'est pas une configuration normale.
4En fait, la valeur par défaut dst refspec pour une branche est compliquée: cela dépend de votre Push.default
configuration, et s'il existe un remote.repository.Push
paramètre, et s'il y a un amont configuré, et ainsi de suite. Pour les balises, les règles sont plus simples car il n'y a pas de "amont".
Voici un exemple concret:
git add .
git commit -m "some description"
git tag v0.1.9 # or any other text
git Push Origin master # Push the commit
git Push --tags Origin # Push the tags
Une fois que vous avez créé la balise (ce qui ressemble à ce que vous avez fait), exécutez simplement
git Push --tags Origin