git pull会执行哪些HEAD操作?合并时ORIG_HEAD等是否变更?
git pull的HEAD相关操作及ORIG_HEAD/MERGE_HEAD疑问解答
一、git pull涉及的HEAD相关操作
git pull本质是git fetch + 后续的合并/变基操作,具体HEAD的变化分两种场景:
1. 默认场景:git fetch + git merge
- git fetch阶段:会将远程分支的最新提交拉取到本地,更新对应远程追踪分支(比如
origin/main),同时把拉取到的最新commit记录到FETCH_HEAD文件中(就像你执行git fetch origin main看到的输出那样)。 - git merge阶段:根据当前分支和远程分支的提交关系,有两种情况:
- 快进合并(Fast-forward):如果当前分支的所有提交都已经包含在远程分支里,Git会直接将
HEAD移动到远程分支的最新commit,不会生成新的合并提交。这种情况下,HEAD只是单纯移动位置,没有其他特殊引用变更。 - 非快进合并(True merge):如果两边有各自独立的提交,Git会创建一个新的合并提交,此时:
HEAD会指向这个新生成的合并提交;ORIG_HEAD会被设置为合并前当前分支的HEAD指向的commit;MERGE_HEAD会被设置为被合并的远程分支commit(也就是FETCH_HEAD指向的内容)。
- 快进合并(Fast-forward):如果当前分支的所有提交都已经包含在远程分支里,Git会直接将
2. 配置pull.rebase=true时:git fetch + git rebase
如果你的Git配置了pull.rebase=true,那么pull会执行git fetch + git rebase:
- 先完成fetch拉取远程最新提交;
- 然后将当前分支的所有提交重新应用到远程分支的最新提交之上;
- 最终
HEAD会指向重新应用后的最新commit,这个过程不会生成合并提交,也不会更新ORIG_HEAD或MERGE_HEAD。
二、为什么git pull main没提到ORIG_HEAD/MERGE_HEAD
你执行git pull main时输出没提及这两个引用,大概率是因为发生了快进合并:
- 快进合并不需要创建新的合并提交,只是单纯移动
HEAD到远程分支的最新位置,所以Git不会更新ORIG_HEAD和MERGE_HEAD; - 只有当合并是需要创建新commit的非快进合并时,这两个引用才会被生成/更新,此时你才会在输出中看到相关提示(比如“Merge made by the 'ort' strategy.”之类的合并信息)。
你可以通过以下命令验证当前是否是快进合并的情况:
git log --oneline --graph
如果看不到合并节点,说明是快进合并;如果有合并节点,则是非快进合并,此时ORIG_HEAD和MERGE_HEAD应该已经被设置。
内容的提问来源于stack exchange,提问作者mfaani
相关产品推荐
相关产品推荐

