Git:交互式地重新整理一系列提交

19

我正在尝试对我历史记录中较早的一些提交进行 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

我希望压缩三个测试提交。 在这种情况下,git rebase -i HEAD~106不太实用。 我想要的是类似于git rebase -i 64bd9e7:26c612d的东西。

Git是否具有此类行为,如果有,我该如何使用它?

我查看了这篇文章,但它没有回答我的问题。


3
尝试在历史上做出深远改变往往是不明智的。请记住,你对过去所做的任何改变都会影响到现在:每个压缩后的提交之后的提交都会复制到一个新的不同提交中,以提供这个新的历史记录。 - torek
3个回答

21

只需使用 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 变基教程


11
你说"git rebase -i HEAD~106不太实用"。
如果你所指的问题是最终的脚本文件长度超过100行,那确实不太好,但是它可以工作。
如果你的意思是回溯计算要使用106个提交很繁琐,那有一个解决方案。
你需要最早提交的父级哈希值,然后可以执行以下操作:
git rebase -i <parent-hash> my-branch

或者您可以执行

git rebase -i <parent-hash> HEAD

之后你就会处于一个独立的分支,你可以随心所欲地处理它。

因此,在您的示例中,您可以这样做:

git rebase -i 694bdda HEAD

(但我仍然同意其他评论,你是否真的想要改变那么久远的东西呢?当我发现自己在这样做时,我觉得它有点代码异味。对我来说,拥有如此长的分支而没有推送/共享它是不寻常的。我也会创建一个备份分支来进行测试。)


6
为了合并这三个提交,您需要重写整个存储库的历史记录。也就是说,在这些测试提交之后的所有提交哈希将被修改。在我看来,最直接的方法是:
  1. 创建一个临时分支并检出指向64bd9e7的分支。
  2. 将这三个提交合并在一起。
  3. 检出您的主分支,并将其重置为64bd9e7之后的提交。
  4. 将它重新基于您的临时分支。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接