git push sends branches, not tags. Push a tag by name (git push origin v1.0.0), or let --follow-tags send every annotated tag that points into the history you push. The listing then publishes a stray lightweight tag and deletes it everywhere:
git push --follow-tags
git tag v1.0 && git push -q origin v1.0
cd ../laptop && git fetch -q && git tag
cd ../booknest && git tag -d v1.0 && git push -q origin --delete v1.0
cd ../laptop && git fetch --prune --prune-tags
cd ../booknestOutput
To ../server/booknest.git a2508da..8211cbb main -> main * [new tag] v0.9.0 -> v0.9.0 * [new tag] v1.0.0 -> v1.0.0 v0.9.0 v1.0 v1.0.0 Deleted tag 'v1.0' (was 8211cbb) From /home/dev/v5-ch2/booknest/../server/booknest - [deleted] (none) -> v1.0
push.followTags true makes every push do this; avoid git push --tags, which publishes stray lightweight tags too. A fetch brings the tags that point into the history it downloads, but never removes one unless you ask with --prune-tags (Git 2.17 1,932 ). Never move a published tag: Git does not update an existing tag behind a user's back, so clones keep the old commit under the same name. Tag the fix as a new version instead.