Git常见问题(一)——本地tag和远程仓库tag不一致

三味码屋 2021年10月16日 2,069次浏览

问题

在使用Git的过程中,我们执行git fetch命令时可能会报如下错误:

 ! [rejected]        testaaa-tag1 -> testaaa-tag1  (would clobber existing tag)

原因

按错误信息的字面意思理解,可以大致猜测出执行git fetch被拒绝的原因是会对现有的tag造成影响,那么真正的原因是什么呢?其实真正的原因正如我们猜测的那样,是因为本地的tag和远程仓库中的tag不一致,所以执行git fetch时,Git认为一旦允许命令执行,那么远程仓库中的tag将会在用户没有察觉的情况下覆盖本地的tag,tag数据将会错乱。

问题如何产生

那么什么样的场景会导致本地tag和远程仓库中的tag不一致呢?这里我举个简单的例子:

  1. 本地创建分支A;
  2. 把分支A push到远程仓库;
  3. 在分支A上打一个Tag,取名为tag1;
  4. 把tag1 push到远程仓库;
  5. 本地创建分支B;
  6. 把分支B push到远程仓库;
  7. 删除远程仓库中的tag1;
  8. 在远程仓库中,在分支B上打一个tag,也取名为tag1;
  9. 在本地执行git fetch --tags命令。

按照以上步骤便能复现问题。

解决办法

那么我们怎样解决这个问题呢?比较简单的办法就是从本地删除对应的tag,然后再执行git fetch命令,如下:
从本地先删除错误信息中提示的tag:

git tag -d testaaa-tag1

删除后重新执行git fetch命令:

git fetch --tags

结果如下:

 * [new tag]         testaaa-tag1 -> testaaa-tag1

至此,命令已经可以正常执行了,错误得到了解决。

系列推荐
Git常见问题(二)——你的Feature分支需要Update了