如何合并最后两次提交?

时间:2017-07-12 09:06:29

标签: git git-merge git-rebase

我想结合我的最后两次提交。以下是git log

的结果

enter image description here

现在我想将最后两个提交(进入阅读框)合并到一个提交中。我怎么能这样做?

2 个答案:

答案 0 :(得分:11)

您正在寻找互动squash的{​​{1}}功能:

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

有关详细说明,请参阅here

一如既往地搞乱历史(就像将不同的提交压缩成新的一样),你应该只对那些你确定没有人根据其工作的提交执行这样的操作。

答案 1 :(得分:10)

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

使用git reset的方法:

  1. 无论采用何种方法,都要确保工作副本是干净的。使用git status查找。如果存在未提交的更改,请将它们保存在存储区中(git stash或将其提交到临时分支。
  2. 运行git branch backup以在当前提交上创建备份分支 它并不是真正需要的(使用reflog或通过写下当前提交的哈希值可以实现相同的结果),但如果出现问题,这是恢复当前状态的最简单方法。
  3. 运行git reset --soft HEAD~2
    这会移动HEAD两次提交(在提交e8de117上)而不更改工作树或索引。索引和工作树现在看起来就像是在创建提交6aa74e4之前。最后两次提交中更改的所有文件都已添加到索引中。由于HEAD位于e8de117,因此下一次提交将在e8de117之上创建(它将“替换”提交6aa74e477c15d6)。
  4. 运行git commit。您必须输入新的提交消息。
  5. 如果结果看起来不像您预期​​的那样(git diff backup不应该报告任何差异)或者您已经改变主意,请运行git reset --hard backup以返回您开始的位置(实际上,正确在步骤#2之后。
  6. 如果您对输出感到满意,请删除在步骤2(git branch -D backup)创建的backup分支。
  7. 就是这样。