git 压缩旧的提交(不是最后一个)

git squash older commits (not last one)

我有一段非常混乱的 git 历史。我想压缩一堆旧的提交(不包括最后一个)。

我知道如何压缩我最后的 n 提交。但这是不同的。在这里,我连续提交了 n1n2,我想将其压缩成一个,而在 n2 之后,我有一个提交历史,我想保留到最后一个。

所以,如果我当前的历史是这样的:

---- n1 --- n2 -------- m

我想将 n1 压缩为 n2,所以它最终看起来像这样:

---- n1n2 -------- m

其中 n1n2 是包含从 n1n2.

压缩内容的单个提交

我应该怎么做?从n2m对历史有什么影响?

也就是说,n2m 的每个提交的哈希值是否会因我想做的事情而改变?

您可以根据 the docs and this blog post 进行交互式变基。

  1. 开始交互式变基:

    git rebase -i HEAD~n
    

    (其中 n 是你想回到历史多远)

  2. 您的默认编辑器将打开。在顶部,将以相反的顺序显示您最近的 n 提交列表。例如:

    pick a5f4a0d commit-1
    pick 19aab46 commit-2
    pick 1733ea4 commit-3
    pick 827a099 commit-4
    pick 10c3f38 commit-5
    pick d32d526 commit-6
    
  3. 为所有要压缩的提交指定 squash(或快捷方式 s)。例如:

    pick a5f4a0d commit-1
    pick 19aab46 commit-2
    squash 1733ea4 commit-3
    squash 827a099 commit-4
    pick 10c3f38 commit-5
    pick d32d526 commit-6
    

    Git 应用该更改和直接在它之前的更改,并使您将提交消息合并在一起。

  4. 保存并退出。

  5. Git 将应用所有更改并将再次打开您的编辑器以合并三个提交消息。您可以修改您的提交消息或保持原样(如果是这样,所有提交的提交消息将被连接起来)。

  6. 大功告成!您选择的提交将全部与前一个一起压缩。