99

I have some tags on my "origin" repository. Then I realized I needed to add some changes on one of the tags, and push them back on my repository. Is there a way I can push an existing tag to the repository in one time, or should I delete the tag before ?

1

5 Answers 5

98

This should not be the practice, though you can delete the tag and push the change to the remote repo.

git tag -d tag1
git push origin :refs/tags/tag1
Sign up to request clarification or add additional context in comments.

4 Comments

Also git push --delete origin tag1. See here
In 2023 (v2.37.1), that didn't work for me without --follow-tags: git push --follow-tags origin :refs/tags/stage.
Why shouldn't this be a practice?
@Marko Because a tag should reference a fixed commit hash and not be changed. This is a similar to not replacing a software version after it has been released as this usually is done by malicious actors. However, I suppose it is fine if you wand to use a single tag for testing stuff and not using it in release cycles.
83

So if you need to move a tag (eg: "v0.5") on a git branch (eg: "master") to a different commit, probably a newer one, then you can use the -f option to git tag:

-f
--force

Replace an existing tag with the given name (instead of failing)

You probably want to use -f in conjunction with -a to force-create an annotated tag instead of a non-annotated one.

Example

  1. Delete the tag on any remote before you push

    git push origin :refs/tags/<tagname>
    

    or for our example:

    $ git push origin master :refs/tags/v0.5
    To [email protected]:org_name/repo_name.git
    - [deleted]         v0.5
    
  2. Replace the tag to reference the most recent commit (using -f will save us the git tag -d <tagname> local tag deletion step).

    git tag -fa <tagname>
    

    or for our example:

    $ git tag -fa "v0.5" -m "version 0.5"
    Updated tag 'v0.5' (was f55c93f)
    
  3. Push the tag to the remote origin

    git push origin --tags
    

    or for our example:

    $ git push origin master --tags
    Counting objects: 1, done.
    Writing objects: 100% (1/1), 196 bytes | 0 bytes/s, done.
    Total 1 (delta 0), reused 0 (delta 0)
    To [email protected]:org_name/repo_name.git
    * [new tag]         v0.5 -> v0.5
    

1 Comment

the -f options cause the following error for me: error: failed to push some refs to 'gitserver....'
13

Assuming newtag is the new tag and oldtag is the old tag. Simply do:

# Create new tag that points to the same of old tag
git tag newtag oldtag

# Remove oldtag
git tag -d oldtag

# Remove oldtag in remote machine
git push --delete origin oldtag

# Propapate newtag to remote machine
git push --tags

1 Comment

With this solution, the comment in annotated tag is the old one. If ypu want to replace to another, you have to delete the old tag (git tag -d oldtag, git push --delete origin oldtag) and make new tag (git tag -a newtag HASH, git push --tags)
10

Way simpler way to replace a tag, also on remote:

git tag -f mytagname
git push -f --tags

2 Comments

Other working trees may still have the old tag ref, even after pulling
This is good as a one step solution when you're in total control of the remote as an alternative to delete the remote reference then add back the same reference. Because github releases break if the ref is removed remotely
3

I'm not sure I understand your question, but it sounds like it would be simplest to delete the tag, push your change, then re-add the tag...

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.