Git父分支squash合并到master后,子分支该如何正确调整?
问题解答
1. 猜测正确性判断
你的猜测完全正确。父分支的提交被squash合并到master生成M52后,原P1P4的提交不会出现在master的提交历史中,child分支的C1C3提交的父提交(P4)不属于master链路,所以会呈现为从M3之后直接分叉出C1~C3的结构。
2. 具体操作命令
操作前建议先给当前child分支打个临时备份标签,避免操作失误丢失代码:git tag backup_child_before_rebase
后续如果要恢复的话执行git reset --hard backup_child_before_rebase即可回到操作前的状态。
正式操作步骤如下:
- 第一步:切换到master分支,拉取最新代码,确保本地已经同步到包含M52的最新版本
git checkout master git pull origin master
- 第二步:切换到child分支
git checkout child - 第三步:执行带onto参数的rebase操作
git rebase --onto master P4
说明:
- 命令中
P4需要替换为你本地P4提交对应的哈希值,如果你不确定P4的哈希,可以执行git log --oneline找到C1提交的前一条提交记录的哈希值填入即可- 该命令的含义是:将当前child分支上、所有在P4提交之后的提交(也就是C1~C3),全部迁移到master分支的最新提交(即M52)上
- 第四步:处理冲突(如果存在)
若rebase过程中提示冲突,手动修改冲突文件后执行git add <冲突文件名>,再执行git rebase --continue即可继续流程;如果想要终止本次rebase,执行git rebase --abort即可回到操作前的状态。 - 第五步:推送更新到远程(如果之前已经推送过child分支到远程仓库)
因为rebase会改写分支提交历史,所以需要强制推送,推荐使用更安全的--force-with-lease参数,避免覆盖其他同事推送到远程child分支的新改动:git push --force-with-lease origin child
操作完成后你的分支结构就会变成预期的C1~C3基于M52检出的结构。
内容的提问来源于stack exchange,提问作者Trilokinath Modi
相关产品推荐
相关产品推荐

