问题
在使用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不一致呢?这里我举个简单的例子:
- 本地创建分支A;
- 把分支A push到远程仓库;
- 在分支A上打一个Tag,取名为tag1;
- 把tag1 push到远程仓库;
- 本地创建分支B;
- 把分支B push到远程仓库;
- 删除远程仓库中的tag1;
- 在远程仓库中,在分支B上打一个tag,也取名为tag1;
- 在本地执行
git fetch --tags
命令。
按照以上步骤便能复现问题。
解决办法
那么我们怎样解决这个问题呢?比较简单的办法就是从本地删除对应的tag,然后再执行git fetch
命令,如下:
从本地先删除错误信息中提示的tag:
git tag -d testaaa-tag1
删除后重新执行git fetch
命令:
git fetch --tags
结果如下:
* [new tag] testaaa-tag1 -> testaaa-tag1
至此,命令已经可以正常执行了,错误得到了解决。