使用 Git 将对文件的更改分发到最后一次提交以修改每个文件(修复更改文件的最后一次提交)

Distribute changes to files to the last commit to modify each file (fixup last commit that changed the file) with Git

git 上是否有 way/command 来将对某些文件所做的更改“分发”到修改每个文件的最后一次提交?

在很多情况下,我注意到已经提交的文件中有一个小的拼写错误(主要是评论:缺少逗号、括号结束、一些小的语法错误...)。我想修复每个文件的最后一次提交以添加小修复。是否可以不必手动进行提交,运行 rebase --interactive,将提交向上移动,将其标记为上一次提交的 fixup...

例如:假设我有这种情况:

Commit A: to add a new feature.   0xa1b2c3         2021/03/10 00:00:00
     |-> last commit that modified file '/home/borrajax/projects/feature.py'

Commit B: to test the feature.    0xd4e5f6         2021/03/10 00:05:00
     |-> last commit that modified file '/home/borrajax/projects/test_feature.py'

Commit C: something unrelated.    0x112233         2021/03/10 00:10:00
     |-> doesn't alter 'feature.py' or 'test_feature.py'

然后,我修正了 feature.pytest_feature.py

中的一些小错别字

有没有一种方法可以说 “将文件 feature.py 上的这些小更改添加到提交 A”“将这些小更改添加到文件上test_feature.py 提交 B(保持提交顺序 A -> B -> C)

我目前做的是:

  1. feature.py 上的更改添加到提交中,例如 “修复提交 A”
  2. test_feature.py 上的更改添加到 之类的提交中"Fixup 提交 B
  3. 运行一个rebase --interactive
  4. 移动 "Fixup..." 在我要修复的提交下面提交("Fixup Commit A""Commit A : 添加...""Fixup commit B under "Commit B: to test...")
  5. --interactive 编辑器中将它们标记为 fixups

这相当耗时,而且很容易出错。

我已经阅读了另外两个 S.O 问题 (Git distribute fixup commit to original commits and git: squash/fixup earlier commit),但我认为建议的解决方案并不完全符合我的要求(也许我错了,他们做,虽然...)

Is that possible without having to manually do a commit, run rebase --interactive, move the commit up, mark it as a fixup of the previous commit...

是的,rebase 会为您做这件事。见其--autosquash option.

  1. git commit --fixup=<ref> 标记您的提交,指向您要修复的提交。 (消息搜索语法非常方便:--fixup=@^{/somewordfromitssubject}。)
  2. 创建任意数量的修复提交。
  3. git rebase -i --autosquash theoldestfixedupcommit^.