git squash 较旧的提交(不是最后一个)

bec*_*cko 19 git git-rebase

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

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

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

---- n1 --- n2 -------- m
Run Code Online (Sandbox Code Playgroud)

我想挤压n1n2所以它最终看起来像这样:

---- n1n2 -------- m
Run Code Online (Sandbox Code Playgroud)

wheren1n2是包含压缩内容的单个提交n1n2

我该怎么做?从n2到对历史有什么影响m

也就是说,将每一个哈希从承诺n2m变化的是我想要做的后果?

lud*_*ico 26

您可以根据文档此博客文章进行交互式变基。

  1. 启动交互式变基:

    git rebase -i HEAD~n
    
    Run Code Online (Sandbox Code Playgroud)

    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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 保存并退出。

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

  6. 你完成了!您选择的提交都将与前一个提交一起压缩。

  • 只是为了确认。在你放置的这个例子中,提交 2、3、4 将被压缩成一个提交,我们称之为提交“2*”。我的新历史将包含提交`1, 2*, 5, 6`。此外,`1` 将保留其旧的 SHA-1,但 `2*, 5, 6` 将全部获得新的 SHA-1 哈希值。我对么? (5认同)
  • @becko 正确——commit 2* 得到一个新的哈希值,因为提交的内容现在不同了;提交 5 和 6 获得新的哈希值,因为它们的父提交 ID 已更改。更多详情:/sf/answers/2299847511/ (4认同)