13

我正在尝试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 是否有这种行为,如果有,我该如何使用它?

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

4

3 回答 3

15

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

于 2017-07-26T20:19:20.290 回答
4

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

  1. 创建一个临时分支并结帐指向64bd9e7.
  2. 将三个提交压缩在一起。
  3. 签出您的主分支,并在64bd9e7.
  4. 将其重新定位到您的临时分支
于 2017-07-27T00:45:08.397 回答
3

你说“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

(但我仍然同意其他评论,关于你是否真的想改变很久以前的东西。我认为当我发现自己这样做时,这有点代码味道。我有这么长的时间是不寻常的分支而不推送/共享它。我也会创建一个备份分支来测试它。)

于 2022-02-18T11:10:05.200 回答