问题与诉求
我的本地分支上有连续的多次提交,历史链条如下:
commit-D(本地最新)
⬆
commit-C
⬆
commit-B
⬆
commit-A
⬆
origin/master(远端最新)
在 commit-B 中,我修改了多个文件,其中包括 README.md。
我想把 commit-B 中关于 README.md 的改动 单独剥离出来,向前合并进 commit-A。
调整后的预期历史应该满足:
commit-A包含了原本属于它的改动 + 剥离出来的README.md改动。commit-B变干净了,只保留除README.md以外的其他文件修改。commit-C及后续的所有提交完好无损,依然正常挂在干线上。
为什么我会有此需求?
在平常工作中,我采用 Commit early, Commit often, Clean up before pushing 的工作流:
- 开发阶段,每完成一小步就执行一次 commit。
- 推送前整理。在 git push 之前,用
git rebase -i把那一堆临时 commit 整理成少量语义清晰的 commit。
然而,上述方法的最小操作粒度是 commit,我希望精细到 commit 中某个特定文件。
难点与顾虑
- 后续提交干扰:因为
commit-B后面已经累积了commit-C等后续提交,无法直接用简单的git reset --soft倒回去揉碎重新提交,否则会把后面的改动也混进来。 - 安全性要求:希望操作足够安全、通用,尽量避免在交互式变基(Interactive Rebase)中手动搬运大量代码或整行挪动,防止产生人工误操作。
请教大家
请问针对这种 带有后续提交、且需要精准剥离单个文件向前合并 的场景,业界最标准、安全且优雅的 Git 命令流是什么?(最好能支持自动化处理,避免大范围变基时产生人工操作失误)