Comment envoyer un tag Git à une branche à l'aide d'une refspec?

216

Je veux forcer le push, par exemple, mon tag 1.0.0vers ma masterbranche distante .

Je fais maintenant ce qui suit:

git push production +1.0.0:master

Je veux forcer la poussée , parce que tout ce qui m'importe, c'est que le code à l'intérieur de la1.0.0balise est poussé vers lamasterbranche du référentiel distant.

Qu'est-ce que je fais mal?

Mise à jour # 1

Lorsque je SSH sur mon serveur où se trouve mon référentiel Git et que git branch -lje l' exécute , je ne vois pas non plus la masterbranche répertoriée.

Mise à jour # 2

Après avoir exécuté git tag -ldepuis l'intérieur du référentiel Git distant, je vois que cela masterest répertorié, ce qui signifie que lorsque j'ai exécuté ce qui suit:

git push production 1.0.0:master

Il a en fait poussé la balise et créé une balise nommée master plutôt qu'une nouvelle branche .

Je veux essentiellement pousser le contenu de la balise 1.0.0dans la masterbranche du référentiel Git distant.

Michael van Rooijen
la source
Pouvez-vous préciser ce que signifie «ne pas travailler»? Git donne-t-il une erreur spécifique ou a-t-il un effet nul?
vcsjones
Je suis désolé. Oui, donc en gros quand je SSH sur mon serveur, dans le dépôt git, et que je lance git branch -l pour lister les branches, je ne vois que mon autre branche. Cependant, la production git push +1.0.0: master did push, et quand je repousse, tout est à jour , mais je ne vois pas la branche master sur le serveur distant.
Michael van Rooijen
5
Vous devez modifier la réponse acceptée. La deuxième réponse est beaucoup plus simple que celle qui est marquée comme acceptée.
Pedro Rolo
Désolé pour la réponse tardive. Je suis d'accord et j'ai maintenant changé la réponse acceptée.
Michael van Rooijen
1
@MichaelvanRooijen Je ne comprends pas comment la réponse acceptée que vous avez choisie résout réellement ce problème. Il n'écrase pas une branche avec une balise, il pousse simplement vos balises vers la télécommande.

Réponses:

61

Il échoue probablement car il 1.0.0s'agit d'une balise annotée. Vous avez peut-être vu le message d'erreur suivant:

erreur: tentative d'écriture d'un objet non validé dans les références de branche / têtes / maître

Les balises annotées ont leur propre type d'objet distinct qui pointe vers l'objet de validation balisé. Les branches ne peuvent pas pointer utilement pour marquer des objets, mais uniquement valider des objets. Vous devez «décoller» la balise annotée pour valider l'objet et pousser à la place.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Il existe une autre syntaxe qui fonctionnerait également dans ce cas, mais cela signifie quelque chose de légèrement différent si l'objet tag pointe vers autre chose qu'un commit (ou un objet tag qui pointe vers (un objet tag qui pointe vers un…) un commit) .

git push production +1.0.0^{}:master

Ces syntaxes de décollage de balises sont décrites dans git-rev-parse (1) sous Spécification des révisions .

Chris Johnsen
la source
1
Cela a résolu le problème! Cependant , le maître branche doit déjà exister. Ce n'est pas un problème de ma part cependant. Merci beaucoup pour votre aide!
Michael van Rooijen
2
@Michael: Ahh. Oui, si le maître n'existe pas (sous forme de branche ou de balise), il git push rep +tag:mastercréera alors une balise nommée maître au lieu d'une branche. git push rep +tag~0:master(là encore, lorsque le maître n'existe pas en tant que branche ou balise) échouera avec «erreur: impossible de pousser vers une destination non qualifiée». La commande qui aurait fait ce que tu voulais (avant tout maître branche / tag existait) est git push rep +tag~0:refs/heads/master( refs/heads/est l'espace de noms dans lequel les branches sont stockées).
Chris Johnsen
GÉNIAL! Cela m'aidera incroyablement bien. Très pratique! Merci beaucoup d'avoir également publié ces informations.
Michael van Rooijen,
4
@brad: La ~{commit}syntaxe est littérale (c'est-à-dire toujours ces neuf caractères); le mot commitn'est pas un espace réservé ici.
Chris Johnsen
1
Ah ok! désolé, je pensais que vous vouliez mettre dans le commit particulier, a plus de sens maintenant.
brad
469
git push --tags production
bstpierre
la source
4
Si la balise existe déjà sur la télécommande, vous devrez d'abord supprimer la balise distante avec git push production :1.0.0.
respectTheCode
1
Si par n'importe quelle occasion vous aurez une branche avec le même nom: '1.0.0' cette poussée échouera donc mieux utiliser: git push production :refs/tags/1.0.0pour supprimer la balise seulement
Vladimir
1
@Nerian: Je pense que ça pousse juste les balises
bstpierre
5
Comment cela résout-il réellement le problème de l'affiche originale concernant l'écrasement d'une branche avec une étiquette en la poussant de force? Cela pousse simplement toutes vos balises vers une télécommande, cela n'écrasera aucune branche.
1
La question n'est-elle pas de savoir comment pousser une balise? Cette commande fait bien plus que cela.
Chris Martin
61

Je crée le tag comme ceci et ensuite je le pousse vers GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1
neoneye
la source
4
il pousse tous vos tags
Dawid Drozd
2
Notez que cela ne résoudra pas réellement le problème de l'affiche originale concernant l'écrasement d'une branche avec une balise, cela poussera simplement vos balises vers une télécommande, sans affecter les branches.
10

Pour pousser une seule balise: git push <reponame> <tagname>

Par exemple, git push production 1.0.0. Les balises ne sont pas liées aux branches, elles sont liées aux commits.

Lorsque vous souhaitez avoir le contenu de la balise dans la branche principale, faites-le localement sur votre machine. Je suppose que vous avez continué à vous développer dans votre branche maître locale. Alors juste un git push origin masterdevrait suffire.

koppor
la source
5
Notez que cela ne résoudra pas réellement le problème de l'affiche originale concernant l'écrasement d'une branche avec une balise, cela poussera simplement vos balises vers une télécommande, sans affecter les branches.