为何在非master分支执行git pull origin master:master会触发分支变基?
为什么在foo分支执行
git pull origin master:master会触发foo分支的变基? 关键:你误解了git pull的refspec规则
你以为git pull origin master:master是更新本地master分支,但实际上这个命令的行为完全不是这样。
先明确git pull的本质:它是git fetch + git merge(或git rebase,取决于你的仓库配置)的组合。当你指定master:master这个refspec时,它的核心含义是把远程origin的master分支内容,合并/变基到当前所在的本地分支,同时尝试更新本地master分支——但后面这个更新操作根本不会生效,因为你当前不在master分支,Git不允许直接修改非当前分支的提交历史。
结合你的操作过程具体分析
- 你切换到foo分支后执行
git pull origin master:master - Git先执行
git fetch origin master,把远程master的内容拉到本地 - 因为你的仓库可能开启了
pull.rebase=true配置,Git接下来会尝试将当前分支foo变基到刚拉取的origin/master上,这直接导致了冲突,从你的git status输出能明确看到:interactive rebase in progress; onto 9937b9108989 You are currently rebasing branch 'foo' on '9937b9108989'. - 而你期望的“更新本地master分支”这一步,因为当前不在master分支,Git无法修改master的分支指针,所以完全没生效——这就是你切回master后,
git log没有任何变化的原因。
实现你需求的正确方式
如果想在foo分支下更新本地master分支,别用git pull,直接用git fetch:
git fetch origin master:master
这个命令会直接把远程origin的master分支同步到本地master分支,不会影响当前的foo分支。
如果就是想切到master拉取再切回来,最稳妥的还是用你一开始设想的命令:
git checkout master && git pull origin master && git checkout foo
内容的提问来源于stack exchange,提问作者joseville
相关产品推荐
相关产品推荐

