如何将最新的提交压缩为特定的提交(不是之前的提交)?

How to squash the latest commit into a specific commit (which is not the previous commit)?

假设我正在尝试重新设置当前分支的基址,该分支在 master 之上发生了变化:-


And am presented with an interactive window like this with all the new commits listed:

pick A Commit message A
pick B Commit message B
pick C Commit message C
pick D Commit message D
pick E Commit message E

而且我想将 E 压缩到 C 而不是之前的提交 D。有没有办法做到这一点?

因为如果我这样做

pick A Commit message A
pick B Commit message B
pick C Commit message C
pick D Commit message D
squash E Commit message E

它总是会将 E 压缩为 D,但我想将 E 压缩为之前的某个提交,我可以选择 C ​​或 B 或 A。

您可以按您希望的任何方式对 "interactive window" 中的行重新排序,变基将重新排序相应的提交。例如,您可以移动提交 C 的行,使其位于提交 E:

的行上方
pick A Commit message A
pick B Commit message B
pick D Commit message D
pick C Commit message C
squash E Commit message E

现在生成的历史记录将按顺序包含来自提交 A、B 和 D 的更改,然后包含来自提交 C 和 E 的更改的新提交被压缩为单个提交。

或者,将提交 E 的行移动到提交 C 的行下方:

pick A Commit message A
pick B Commit message B
pick C Commit message C
squash E Commit message E
pick D Commit message D

这将按顺序保留提交 A 和 B 的更改,然后使用 C 和 E 的组合更改创建一个新提交,最后创建一个与 D 具有相同更改的新提交。