Git执行git fetch更新master分支报错:拒绝拉取到已检出分支
Git fetch origin master:master 执行失败的原因分析
问题场景
此前一直通过命令git fetch origin master:master在未处于master分支时更新本地master分支,今日在某仓库克隆版本执行时失败,报错:
fatal: refusing to fetch into branch 'refs/heads/master' checked out at '/path/to/project/directory'
执行命令时并未处于master分支,且同一仓库的其他克隆版本可正常执行。环境为macOS Monterey 12.6 (21G115),Git版本为Homebrew安装的2.38.0。
补充命令输出:
$ git worktree list /path/to/project/directory aa00aa0a0a0 [my-current-branch]
$ git branch -vv main bb11bb1b1b1 Title of the commit on main master cc22cc2c2c2 [origin/master] Title of the commit on master * my-current-branch aa00aa0a0a0 [origin/my-current-branch] Title of the commit on my-current-branch
$ git remote show origin * remote origin Fetch URL: git@github.com:my-org/my-repo.git Push URL: git@github.com:my-org/my-repo.git HEAD branch: master Remote branches: main tracked master tracked my-current-branch tracked
核心原因
Git 禁止直接更新被任何工作树检出的分支,哪怕当前所在工作树并未切换到该分支。报错说明master分支在仓库的某个工作树中被检出了——大概率是你之前通过git worktree add创建过基于master的工作树,之后删除了工作树目录但未执行git worktree prune清理Git的追踪记录,导致Git仍认为master被其他工作树占用。
验证方法
执行以下命令查看Git追踪的所有工作树(包括目录已删除但未清理的无效记录):
git worktree list --porcelain
如果输出中存在指向master分支的条目,哪怕对应的目录不存在,即可确认是该问题导致的报错。
解决办法
1. 清理无效工作树记录
如果那个基于master的工作树已不再需要,执行以下命令清理Git的无效工作树追踪记录:
git worktree prune
清理完成后,重新执行git fetch origin master:master即可正常更新。
2. 绕开直接更新限制
如果暂时无法清理工作树,可通过间接方式更新master分支:
# 先将远程master拉取到临时分支 git fetch origin master:tmp-master # 切换到master分支合并临时分支 git checkout master git merge tmp-master # 删除临时分支并切回原分支 git branch -D tmp-master git checkout my-current-branch
或者更简洁的方式(若允许切换到master分支):
git checkout master git pull origin master git checkout my-current-branch
内容的提问来源于stack exchange,提问作者mgol
相关产品推荐
相关产品推荐

