如何用ours策略合并不生成新提交?为分支HEAD添加父节点且不改动内容
如何用Ours策略实现“伪合并”(仅添加父节点不改动提交内容)
当然有办法!你要的本质是给当前分支的最新提交额外添加一个父节点,让它看起来和other_branch完成了合并,但完全保留原提交的内容——这刚好可以通过git merge结合git commit --amend实现,而你之前试的merge --squash确实行不通(毕竟squash本身就不会生成带父节点的合并提交,再加上ours策略的空合并,自然没效果)。
具体操作步骤如下:
- 先切换到你要修改的目标分支(也就是你说的
HEAD所在分支),执行一个不提交的Ours合并:
git merge -s ours --no-commit other_branch
--no-commit参数会让Git完成合并的准备工作(比如记录要合并的分支),但不会自动生成合并提交,此时你的工作区和暂存区都不会有任何内容变化。
- 接着用
commit --amend修改当前的最新提交,把刚才的合并关系加进去:
git commit --amend --no-edit
--no-edit会保留原提交的所有信息(提交说明、作者等),如果你想给这次“伪合并”加个备注,去掉这个参数就行,编辑提交信息后保存即可。
完成这两步后,你的目标分支尖端提交就会多一个指向other_branch尖端的父节点,提交内容却和之前完全一致——完全符合你的预期。
注意事项:
- 这个操作属于修改历史,目标分支的最新提交SHA会改变。如果这个分支已经推送到远程仓库,你需要用更安全的强制推送:
git push --force-with-lease(避免覆盖其他人的修改)。 - 为什么之前的
git merge -s ours other_branch --squash没用?因为squash的作用是把合并的内容压成一个普通提交,而Ours策略下合并的内容是空的,所以相当于没有任何改动,自然不会生成新提交。
内容的提问来源于stack exchange,提问作者ilmirons
相关产品推荐
相关产品推荐

