web-dev-qa-db-fra.com

Que deviennent les balises Git pointant vers un commit supprimé

Dis que je fais ce qui suit:

  1. Créer une branche X
  2. Créer une balise t (vers la branche X)
  3. Pousser
  4. Supprimer la branche X

Qu'arrive-t-il au tag t? est-ce qu'il flotte juste là? est-ce considéré comme un déchet?

Dois-je supprimer toutes les balises pointant sur une branche avant de supprimer la branche elle-même?

Référence

De Git Basics - Tagging :

Git utilise deux principaux types de balises: léger et annoté. Une balise légère ressemble beaucoup à une branche qui ne change pas - c'est juste un pointeur vers une validation spécifique.

40
idanshmu

Que se passe-t-il avec le tag t?

Supposons que vous ayez créé la branche x à partir d'une validation E, puis que vous avez marqué cette validation avec la balise t. Par exemple.

                           x (branch)
                           |
                           V             
A-----B------C------D------E
                           ^
                           |
                           t (tag)

Si vous supprimez la branche x rien ne se passe au tag t.

git branch -D x

La balise pointe toujours pour valider E.

A-----B------C------D------E
                           ^
                           |
                           t (tag)

est-ce considéré comme un déchet?

Non, car la validation est toujours référencée par la balise t.

Que faire si la validation est supprimée?

Vous ne supprimez pas les validations. Vous supprimez les pointeurs vers les validations et si les validations ne sont plus référencées, git les récupérera un jour (en fonction de votre configuration).

Voir git gc

Même si vous avez supprimé toutes les références ordinaires, comme les branches et les balises, les validations seront toujours référencées dans le reflog pendant un certain temps et vous pourrez y accéder, par exemple recréez une branche, étiquetez-la ou choisissez-la et ainsi de suite.

Vous pouvez voir le reflog en utilisant git reflog . Jetez également un œil à gc.reflogExpireUnreachable et gc.reflogExpire

46
René Link

Je ne traite pas le scénario spécifique dans la question de l'OP, mais plutôt la question dans le titre: qu'arrive-t-il à une balise git pointant vers un commit supprimé?

Si, d'une manière ou d'une autre, vous avez réussi à supprimer une validation référencée par une balise (vous ne savez pas comment vous pouvez le faire - voir réponse de René Link ), la balise ne serait qu'un pointeur vers une validation invalide (vous pouvez le tester en modifiant manuellement une balise à partir de .git/refs/tags).

Dans ce cas, la sortie de git tag serait quelque chose comme ceci:

$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc

Le paiement produirait également une erreur:

$ git checkout v1.0
fatal: reference is not a tree: v1.0

Donc, la réponse à une question "Qu'advient-il d'une balise git qui fait référence à un commit supprimé?" c'est rien. Il y restera, pointant vers une référence non valide, jusqu'à ce que vous le supprimiez avec git tag -d <tag>.

5
1615903

Si vous supprimez une branche à partir de laquelle une balise a été créée, cela n'aura aucun effet sur la balise. Une balise ne contient pas de référence d'où elle a été créée.

Si vous voulez en savoir plus sur les balises par rapport aux branches, je recommanderais de regarder cette question: En quoi une balise est-elle différente d'une branche? Laquelle dois-je utiliser ici?

0
Jacob Nelson