Git:交互式地修改一系列提交

tce*_*act 8 git rebase git-interactive-rebase

我正在尝试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
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 12

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

如果您的意思是生成的脚本文件长度 >100 行,那么它不是很好,但它可以工作。

如果你的意思是倒数起来很乏味,需要 106 次提交——就像我有时会遇到的那样,那么有一个解决方案。

您需要所需的最早提交的父级的哈希值,然后您可以执行以下操作:

git rebase -i <parent-hash> my-branch
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做

git rebase -i <parent-hash> HEAD
Run Code Online (Sandbox Code Playgroud)

之后你就会保持一种超然的态度,可以做你想做的事。

所以在你的例子中,你可以这样做

git rebase -i 694bdda HEAD
Run Code Online (Sandbox Code Playgroud)

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


hsp*_*her 6

只需使用rebase -i和压缩这些提交即可。

git rebase -i <main_branch>
# Now just add `s` in front of all the commits you want to squash
Run Code Online (Sandbox Code Playgroud)

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

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

git rebase --onto 694bdda 64bd9e7 5e32fb0
Run Code Online (Sandbox Code Playgroud)

注意:重写历史记录是一项高级操作,因此请谨慎行事。

Git基础教程

  • 答案的第2部分对于重写我的历史记录非常有用 (2认同)

Rob*_*Rob 6

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

  1. 创建一个临时分支并签出指向64bd9e7
  2. 将三个提交压缩在一起。
  3. 签出您的主分支,并将其重置为紧接着的提交64bd9e7
  4. 将其重新设置到您的临时分支上