Git如何将本地远程缺失的临时提交更新至远程分支?
嘿,这个问题问到点子上了!我来一步步给你讲清楚Git是怎么把本地那些远程缺失的提交同步过去的~
先明确推送前后的状态
推送前:
- 本地
featureA提交链:A->B->C->D->E->F->G->T(多了来自master的D、E,以及合并提交T) - 远程
origin/featureA提交链:A->B->C->F->G
这就是git status提示“ahead by 3 commits”的原因——本地比远程多了D、E、T三个提交对象。
Git推送的核心步骤
1. 对比提交历史,找出缺失的提交
Git首先会对比本地featureA和它的远程追踪分支origin/featureA的提交哈希,精准找出本地有但远程没有的所有提交:也就是D、E、T这三个。这里要注意,哪怕D、E是来自master分支的提交,只要远程featureA的历史里没有它们的哈希,就会被归为“缺失提交”。
2. 打包并传输缺失的Git对象
Git里的每个提交都对应一套对象:包括记录提交信息的提交对象、记录目录结构的树对象、记录文件内容的Blob对象。Git会把这些缺失提交对应的所有对象打包成一个高效的压缩包,然后通过网络传输到远程仓库。
这个过程不会重复传输远程已经有的对象(比如A、B、C、F、G这些),只会传缺失的部分,非常高效。
3. 请求远程更新分支指针
当所有缺失对象都传输完成后,Git会向远程仓库发送一个请求:“请把你的featureA分支指针移动到提交T的位置”。
因为远程featureA的当前头G是本地提交T的父提交之一(合并提交T有两个父:G和E),所以远程仓库可以直接安全地把分支指针从G移动到T——这个操作没有冲突,是Git允许的常规更新(除非远程仓库设置了分支保护规则,比如禁止直接推送合并提交)。
4. 同步本地追踪分支
推送成功后,本地的origin/featureA追踪分支会自动更新,指向和远程一样的提交T。这时候你再运行git status,就不会再看到“ahead by X commits”的提示了。
补充几个关键点
- 你用的
git push origin featureA命令,本质就是在告诉Git:“把我的本地featureA分支的状态同步到远程的featureA分支,把需要的提交都传过去”。 - Git判断提交是否存在的唯一依据是提交哈希值,不管这个提交来自哪个分支,只要远程没有这个哈希,就会被推送。
- 合并提交
T的作用是完整记录这次合并操作的上下文,它保存了两个父提交的信息,让后续查看历史时能清晰看到featureA分支是怎么合并master的变更的。
内容的提问来源于stack exchange,提问作者dkjain

