如何合并最后两个提交?

How can I merge the last two commits?

我想合并我的最后两个提交。这是 git log 的结果:

现在我想将最后两个提交 (在阅读框中) 合并为一个提交。我该怎么做?

您正在寻找交互式 rebasesquash 功能:

使用git rebase -i HEAD~2开始交互式变基。在打开的编辑器中,列出了所有属于 rebase 的提交。在这种情况下,由于我们向 rebase 调用提供了 HEAD~2 参数,因此我们看到两个提交,每个都以 pick 为前缀。不改变任何东西都会导致 rebase 到 pick,即应用两个提交,并且没有什么不同。相反,您想要做的是 pick 只有一个提交,而 squash 另一个。这样,您将第二个提交压缩到第一个提交中,从而产生单个提交。当您现在安全退出时,git 将提示您输入新的提交消息,然后瞧瞧:一个包含两个旧提交的更改的新提交。

有关详细说明,请参阅 here

与往常一样,当弄乱历史时(将不同的提交压缩成一个新的提交肯定是这样),你应该只对你确定没有其他人基于他们的工作的提交执行这样的操作。

有很多方法可以做到(使用 rebasereset)。

使用git reset的方法:

  1. 无论采用何种方法,首先要确保工作副本是干净的。使用 git status to find out. If there are uncommitted changes either save them in a stash (git stash 或将它们提交到临时分支。
  2. 运行 git branch backup 在当前提交上创建备份分支。
    它并不是真正需要的(使用 reflog 或通过写下当前提交的哈希值可以实现相同的结果)但如果出现问题,这是恢复当前状态的最简单方法。
  3. 运行 git reset --soft HEAD~2.
    这会在不更改工作树或索引的情况下移动 HEAD 过去的两次提交(在提交 e8de117 时)。索引和工作树现在看起来就像您创建提交之前一样 6aa74e4。在最后两次提交中更改的所有文件都将已添加到索引中。因为 HEADe8de117 上,下一个提交将在 e8de117 之上创建(它将 "replace" 提交 6aa74e477c15d6)。
  4. 运行git commit。您必须输入新的提交消息。
  5. 如果结果不像您预期​​的那样(git diff backup should not report any difference) or if you have changed your mind, run git reset --hard backup 返回到您开始的地方(实际上,就在第 2 步之后)。
  6. 如果您对输出感到满意,请删除在步骤 2 (git branch -D backup) 中创建的 backup 分支。
  7. 就这些了。