如何将两个merge commit压缩为一个多父合并提交?
如何将多个顺序合并提交转为单一章鱼合并提交
当然可以做到!你有两种主要策略来实现这个目标——要么重新进行一次带冲突解决的章鱼合并,要么复用你已经解决好冲突的代码状态来生成新的多父节点合并提交。下面是具体步骤:
策略一:重新发起章鱼合并并解决冲突
这种方法适合你愿意重新梳理一遍冲突解决过程的情况,能直接得到干净的单一合并提交:
先回到三个分支共同的基础提交(也就是
aa36658 Print only evens),创建一个新的临时分支:git checkout -b DI-temp aa36658尝试一次性合并三个目标分支,加上
--no-commit参数让Git暂停在合并状态,不自动创建提交:git merge --no-commit feature1 feature2 feature3此时Git会提示冲突,你可以像之前逐个合并时一样手动解决所有文件冲突。解决完成后,暂存所有修改:
git add .最后创建一个单一的章鱼合并提交,这个提交会同时包含三个分支作为父节点:
git commit -m "Merge feature1, feature2, feature3 into DI"如果你想替换原来的
DI分支,只需要切换回去并重置:git checkout DI git reset --hard DI-temp # 之后可以删除临时分支 git branch -d DI-temp
策略二:复用已解决冲突的代码生成新合并提交
如果你已经在现有的DI分支里解决了所有冲突,不想重复劳动,可以直接利用当前的代码状态创建多父节点提交:
先切换到已经解决完所有冲突的
DI分支:git checkout DI生成当前工作目录和暂存区的树对象(这会输出一个哈希值,比如
abc123):git write-tree使用
git commit-tree命令创建一个新的章鱼合并提交,指定三个分支的头作为父节点,同时设置提交信息:# 把下面的abc123替换成上一步得到的树哈希,分支哈希换成你实际的feature1/2/3的提交ID git commit-tree abc123 -p a278b6b -p befb5e9 -p c9550d0 -m "Merge feature1, feature2, feature3 into DI"执行后会输出一个新的提交哈希,比如
def456。最后把
DI分支指向这个新的合并提交:git reset --hard def456
完成后,你的DI分支就会只有一个合并提交,同时拥有三个父节点,完美替代之前的两个顺序合并提交。
内容的提问来源于stack exchange,提问作者Pacopenguin
相关产品推荐
相关产品推荐

