Git合并指定本地提交遇问题:变基时含远程提交如何处理
如何仅合并指定的4个Git提交
我来帮你理清楚这个问题——你遇到的情况是因为用HEAD~4的时候,Git会顺着提交历史的父节点往前数,而中间的合并提交(那个Merge: c215cbc3 23cf454b的commit)有两个父节点,导致HEAD~4包含了远程仓库里的其他提交,这完全不是你想要的。
正确的做法是直接指定你要合并的那些提交的共同祖先,也就是那个远程同事提交的commit(23cf454b4bf82fe9808259ac7cc76643d45869f8,它也对应origin/play分支)。这样rebase只会处理这个提交之后你自己的所有提交,也就是你想合并的那4个。
具体步骤如下:
执行交互式rebase命令,以远程提交为起点:
git rebase -i origin/play(或者直接用那个commit的哈希值简化版:
git rebase -i 23cf454b)此时会弹出编辑器,里面会显示你在远程提交之后的所有本地提交——正好是你想合并的那4个:
pick 4dffc55b 将downloadThread改为Executor pick c215cbc3 将downloadThread改为Executor pick 069646ced 将downloadThread改为Executor pick 1b6f7af1 修复Play #30、#27、#26问题;GPL #240修改每行的指令:
- 保持第一个提交的
pick不变(这会作为合并后的基础提交) - 把后面三个提交的
pick改成squash(或者fixup:如果不想保留这些提交的说明文字,只保留第一个的提交信息)
修改后大概是这样:
pick 4dffc55b 将downloadThread改为Executor squash c215cbc3 将downloadThread改为Executor squash 069646ced 将downloadThread改为Executor squash 1b6f7af1 修复Play #30、#27、#26问题;GPL #240- 保持第一个提交的
保存并退出编辑器,Git会自动合并这些提交,然后再次弹出编辑器让你编辑合并后的提交信息——你可以把四个提交的内容整合为一个清晰、简洁的描述,比如:
重构downloadThread为Executor,修复Play #30、#27、#26及GPL #240问题最后,因为你修改了Git历史,需要强制推送到远程分支(注意:如果这个分支有其他同事在使用,提前沟通好,强制推送会覆盖远程历史):
git push --force origin bug_fixing
这样操作后,你就成功把那4个提交合并成一个了,git log里也会只显示这个合并后的提交。
内容的提问来源于stack exchange,提问作者Steve M
相关产品推荐
相关产品推荐

