如何合并部分提交为合并提交后重放剩余提交到Git分支?
实现目标提交结构的操作步骤
理想情况:添加与origin/main的合并提交
你的目标是在origin/feature_branch的X提交后,添加一个合并origin/main(包含提交C)的提交,再应用Y、Z的修改,操作如下:
- 创建本地分支追踪
origin/feature_branch(已有本地分支可跳过)
git checkout -b feature_branch_target origin/feature_branch
- 合并
origin/main并创建非快进合并提交(这就是你需要的合并节点)
git merge origin/main --no-ff
执行后会打开编辑器让你编辑合并提交信息,确认后即可生成合并节点。
- 将原
feature_branch上的Y'、Z'提交(对应原Y、Z的修改)应用到当前分支
# 替换<X-hash>为origin/feature_branch最后一个提交X的哈希值 git cherry-pick <X-hash>..feature_branch
或者直接指定Y'和Z'的哈希值:
git cherry-pick <Y'-hash> <Z'-hash>
完成后,分支结构将变为:
A - B - C (origin/main) \ \ V - W - X - Merge origin/main (合并提交) - Y'' - Z'' (feature_branch_target)
备选方案:将V'、W'、X' squash为单个提交
若你更倾向于将变基后的V'、W'、X'压缩为单个提交再添加到X之后,操作如下:
- 切换到变基后的
feature_branch
git checkout feature_branch
- 交互式变基,将
V'、W'、X'压缩为单个提交
# HEAD~4指向V'的父提交(即C),需根据实际提交数量调整数字 git rebase -i HEAD~4
在弹出的交互编辑器中,将W'、X'对应的pick改为squash(或s),仅保留V'的pick,保存退出后编辑新的提交信息,完成后feature_branch将变为C -> V''(压缩后的提交) -> Y' -> Z'。
- 切换到追踪
origin/feature_branch的本地分支
git checkout feature_branch_target
- 依次应用压缩后的提交以及
Y'、Z'
# 替换<V''-hash>为压缩后的提交哈希 git cherry-pick <V''-hash> git cherry-pick <Y'-hash> <Z'-hash>
完成后,分支结构将变为:
A - B - C (origin/main) \ V - W - X - V''(V'、W'、X'的压缩提交) - Y'' - Z'' (feature_branch_target)
内容的提问来源于stack exchange,提问作者g_raham
相关产品推荐
相关产品推荐

