如何非交互式将指定Git提交移至首位并合并同文件后续提交?
Git提交重排与合并解决方案
初始提交序列
* 248e458 (HEAD -> master, origin/master) A.txt * 2dd589d B.txt * cf47156 A.txt * 38d0f87 B.txt
需求说明
- 先将提交
2dd589d B.txt(B.txt的最后一次修改)移至序列顶部,且不改变工作树,目标状态:
* 2dd589d (HEAD -> master, origin/master) B.txt * 248e458 A.txt * cf47156 A.txt * 38d0f87 B.txt
- 后续用
git commit --amend将其与另一个修改B.txt的提交5a61192合并,最终期望状态:
* 5a61192 (HEAD -> master, origin/master) B.txt * 248e458 A.txt * cf47156 A.txt * 38d0f87 B.txt
正确操作步骤
第一步:调整提交顺序,将2dd589d移至顶部
使用交互式变基来调整提交顺序,确保工作树内容不变:
- 执行命令:
git rebase -i 38d0f87^- 这里
38d0f87^指定变基的起始点为最老提交的父节点,确保所有需要调整的提交都被包含在内。
- 这里
- 在弹出的文本编辑器中,将
2dd589d B.txt这一行剪切到列表的最顶部,保存并退出编辑器。 - 完成后提交序列会自动调整到目标的第一步状态,工作树内容不会改变。
第二步:合并5a61192到顶部提交
确保5a61192的修改已应用到当前工作树(如果该提交在其他分支,可先提取其修改):
- 确认当前HEAD指向
2dd589d(即调整后的顶部提交)。 - 提取
5a61192的修改到工作树但不自动提交:git cherry-pick -n 5a61192- 若修改已经在工作树中,可跳过此步。
- 执行合并命令:
git commit --amend --no-edit--no-edit表示保留原提交信息,若需要修改提交信息可去掉该参数。
- 完成后提交序列会变为最终期望的状态。
错误原因分析
之前使用的git rebase --onto cf47156 2dd589d命令逻辑错误:该命令是将**2dd589d之后的提交**(即248e458)移到cf47156之上,相当于直接丢弃了2dd589d提交,因此会丢失该提交的修改,同时改变工作树状态。
内容的提问来源于stack exchange,提问作者Herman
相关产品推荐
相关产品推荐

