【Git 问题求助】如何精准剥离历史提交中的某个文件并向前合并?

问题与诉求

我的本地分支上有连续的多次提交,历史链条如下:

  commit-D(本地最新)
     ⬆
  commit-C
     ⬆
  commit-B
     ⬆
  commit-A
     ⬆
origin/master(远端最新)

在 commit-B 中,我修改了多个文件,其中包括 README.md。

我想把 commit-B 中关于 README.md 的改动 单独剥离出来,向前合并进 commit-A。

调整后的预期历史应该满足:

  1. commit-A 包含了原本属于它的改动 + 剥离出来的 README.md 改动。
  2. commit-B 变干净了,只保留除 README.md 以外的其他文件修改。
  3. commit-C 及后续的所有提交完好无损,依然正常挂在干线上。

为什么我会有此需求?

在平常工作中,我采用 Commit early, Commit often, Clean up before pushing 的工作流:

  1. 开发阶段,每完成一小步就执行一次 commit。
  2. 推送前整理。在 git push 之前,用 git rebase -i 把那一堆临时 commit 整理成少量语义清晰的 commit。

然而,上述方法的最小操作粒度是 commit,我希望精细到 commit 中某个特定文件。

难点与顾虑

  1. 后续提交干扰:因为 commit-B 后面已经累积了 commit-C 等后续提交,无法直接用简单的 git reset --soft 倒回去揉碎重新提交,否则会把后面的改动也混进来。
  2. 安全性要求:希望操作足够安全、通用,尽量避免在交互式变基(Interactive Rebase)中手动搬运大量代码或整行挪动,防止产生人工误操作。

请教大家

请问针对这种 带有后续提交、且需要精准剥离单个文件向前合并 的场景,业界最标准、安全且优雅的 Git 命令流是什么?(最好能支持自动化处理,避免大范围变基时产生人工操作失误)

虽然例子中写的是“README”,但是实际上是把.env文件给提交了是嘛?

遇事不决问AI

一般的操作思路是这样:

  1. 交互式变基到 commit-B 之前:git rebase -i commit-B^
  2. 将 commit-B 设为 edit
  3. reset & stash 所需要的文件
  4. 结束变基:git rebase --continue
  5. 再次开始变基到 commit-A 之前:git rebase -i commit-A^
  6. 将 commit-A 设为 edit
  7. stash pop & commit --amend 所需要的文件
  8. 结束变基:git rebase --continue

手动操作不会很麻烦,但要编写个自动化的脚本就麻烦些,让 AI 按这个思路试着写一个看看吧

典型的cherry pick场景,先备份树,然后reset hard到origin/master,然后把A+B cheery-pick出来,重新提交。
然后后续接着cherry-pick “$B”.."$D"即可

具体操作请让AI完成,这个完全可以脚本自动化。

但是这种操作,有必要固化成脚本吗