git pull是否等同于git fetch + git merge?二者执行结果为何不同
结论
这是Git本身的原生运行逻辑,并非沙箱的功能缺陷。
核心原因拆解
git pull的本质确实是git fetch + git merge的组合,但默认执行的是限定范围的fetch操作,和无参数的git fetch行为并不完全一致:
- 当你在某个本地分支下执行无参数的
git pull时,Git只会拉取当前分支对应的上游远程分支的更新,不会同步远程其他分支的变更,对应的其他远程跟踪分支自然也不会更新。 - 当你执行无参数的
git fetch时,Git会拉取远程仓库所有分支的最新变更,所有远程跟踪分支都会同步到远程最新状态。
结合操作场景具体分析
你操作中的git fakeTeamwork main 1、git fakeTeamwork feature 1相当于同时给远程的main和feature分支各生成了1个新提交:
- 第一组操作最后执行
git pull时,你正处在本地feature分支下,Git只会拉取远程feature分支的新提交更新本地的o/feature远程跟踪分支,不会拉取远程main分支的新提交,o/main仍停留在你clone时的旧状态。 - 第二组操作执行
git fetch时,会同时拉取远程main和feature的所有新提交,o/main和o/feature都会更新到远程最新状态,之后再执行git merge o/feature的前提状态和第一组已经完全不同,最终结果自然不一致。
补充说明
如果需要让git pull也同步所有远程分支的更新,可以使用git pull --all命令,但Git默认采用限定范围拉取的逻辑,是为了减少不必要的同步开销,符合绝大多数日常开发只需要处理当前分支更新的场景。
内容的提问来源于stack exchange,提问作者Jason Li
相关产品推荐
相关产品推荐

