为什么“Git rebase”会将提交压缩到先前的提交中,而不是随后的提交中?

jmb*_*eck 5 git rebase squash

当我压缩分支中的提交(使用 git rebase -i)时,我总是很恼火,因为压缩的提交与旧的提交而不是新的提交结合在一起。

我不明白为什么要这样设计。当我提交正在进行的工作 (WIP) 时,它表示未编译或未完成的代码。当我最终承诺“它终于起作用了!” 在合并之前进行提交和压缩,将这些 WIP 提交合并到“它终于可以工作了!”中更有意义。提交,而不是与之前的提交合并。压缩 WIP 本质上是用我知道无法编译的代码“破坏”了之前的提交。

为了解决这个问题,我的工作流程是压缩来自“它有效!”的提交。一直回到第一次 WIP 提交之前的状态。但这不是很愚蠢吗?其他人在做什么,这使得将 WIP 压缩到之前的提交有意义?

kni*_*ttl 3

使用当前的 Git 版本(从版本 2.32.0 开始包含;在提交 9e3cebd97cbd47909e683e617d5ffa2781f0adaa中引入),您可以fixup -C在交互式变基的待办事项列表中指定以选择压缩/修复时要使用的提交消息,例如

pick 456789 Finished topic XYZ
pick abcdef WIP your incomplete commit
fixup 012345 WIP resolving compiler errors
fixup 6789ab WIP adding unit tests
fixup cdef01 WIP refactoring
fixup -C 234567 Implemented feature ABC
pick 89abcd Another feature
Run Code Online (Sandbox Code Playgroud)

最终将有 2 次提交:“已完成的主题 XYZ”和“已实现的功能 ABC”,而无需手动调整任何提交消息(因此可以避免删除所有这些“WIP”行)。

如果您仍想编辑最终提交消息,请使用-c而不是-C

pick 456789 Finished topic XYZ
pick abcdef WIP your incomplete commit
fixup cdef01 WIP refactoring
fixup -c 234567 Implemented feature ABC
pick 89abcd Another feature
Run Code Online (Sandbox Code Playgroud)

任何其他附加步骤都可以使用一行执行exec

pick 456789 Finished topic XYZ
pick abcdef WIP your incomplete commit
fixup cdef01 WIP refactoring
fixup -C 234567 Implemented feature ABC
exec git commit --amend --reset-author -CHEAD
pick 89abcd Another feature
Run Code Online (Sandbox Code Playgroud)

在 Git 2.32.0 之前,您可以使用以下待办事项列表来解决此限制:

pick 456789 Finished topic XYZ
pick abcdef WIP your incomplete commit
fixup cdef01 WIP refactoring
fixup 234567 Implemented feature ABC
exec git commit --amend -C 234567 # commit id from line above
pick 89abcd Another feature
Run Code Online (Sandbox Code Playgroud)