web-dev-qa-db-fra.com

Comment créer un tag avec certaines validations et le pousser à l'origine?

Supposons que le journal actuel dans mon gerrit ressemble à ceci:

  • commit10 (maître)
  • commit9
  • commit8
  • commit7
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1

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:

  • créer une branche locale basée sur la dernière balise: git checkout -b branchforv1.73.0 v1.72.0
  • cerise-et-vient commit8 et commit9
  • créer une nouvelle balise: git tag v1.73.0

... alors maintenant, comment puis-je pousser la v1.73.0 vers le master?

Résultat:

  • commit10 (maître)
  • commit7
  • commit9 v1.73.0
  • commit8
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1
21
aznmunkey

Fonctionnement des balises

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:

  • chaque commit pointe également vers un autre commit (ou peut-être plusieurs), et
  • pour les branches (et niquement pour les branches), la validation vers laquelle la branche pointe "avance" automatiquement. Autrement dit, lorsque vous ajoutez de nouveaux commits - à certains égards, c'est surtout tout ce que fait git: ajoutez de nouveaux commits à son collectif, un peu comme le Borg de l'ancienne série Star Trek TNG - quelle que soit la branche sur laquelle vous vous trouvez, c'est la branche qui est réajusté pour pointer vers le nouveau commit.

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.)

Pousser les balises

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).

Mettre ensemble

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

54
torek

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
22
qed

Une fois que vous avez créé la balise (ce qui ressemble à ce que vous avez fait), exécutez simplement

git Push --tags Origin
2
Chris