Git: 交互地变基一系列提交

Git: Interactively rebase a range of commits

我正在尝试 rebase -i 我历史上发生的一些提交。假设我有这样的日志:

* 5e32fb0 (HEAD -> master) Add latest feature
* 106c31a Add new feature
* 2bdac33 Add great feature
...100 other commits...
* 64bd9e7 Add test 3
* 3e1066e Add test 2
* 26c612d Add test 1
* 694bdda Initialize repo

我想压缩 3 个测试提交。在这些情况下,git rebase -i HEAD~106 不是很实用。我正在寻找的是 git rebase -i 64bd9e7:26c612d.

git是否有这种行为,如果有,我该如何使用它?

我查看了 this post,但没有回答我的问题。

只需使用 rebase -i 并仅压缩那些提交。

git rebase -i <main_branch>
# Now just add `s` in front of all the commits you want to squash

如果你有很多提交,我建议你看一下 rebase --onto -

git rebase --onto <final_base_commit> <initial_base_commit> <head>

git rebase --onto 694bdda 64bd9e7 5e32fb0

注意:改写历史属于高级操作,请谨慎操作。

Git rebase tutorial

为了压缩这三个提交,您需要重写 整个 存储库的历史记录。也就是说,将修改这些测试提交之后提交的所有提交哈希。在我看来,最直接的方法是:

  1. 创建指向 64bd9e7 的临时分支和结帐。
  2. 将三个提交压缩在一起。
  3. 检查您的主分支,并在 64bd9e7 后立即将其重置为提交。
  4. 将其变基到您的临时分支

你说“git rebase -i HEAD~106不太实用”。

如果您的意思是生成的脚本文件超过 100 行长,这不是很好,但它会起作用。

如果您的意思是倒数很乏味,计算出您需要 106 次提交 - 正如我有时遇到的那样,那么有一个解决方案。

你需要你想要的最早提交的 parent 的哈希,然后你可以这样做:

git rebase -i <parent-hash> my-branch

或者你也可以

git rebase -i <parent-hash> HEAD

之后会让你保持独立的头脑,你可以随心所欲。

所以在你的例子中,你可以做到

git rebase -i 694bdda HEAD

(但我仍然同意其他评论,关于你是否真的想改变那么久以前的事情。我觉得这有点代码味道,当我发现自己这样做的时候。这对我来说很不寻常有这么长的分支没有 pushing/sharing 它。我也会做一个备份分支来测试它。)