如何合并最后两次提交?

sta*_*ack 9 git git-merge git-rebase

我想结合我的最后两次提交.结果如下git log:

在此输入图像描述

现在我想将最后两个提交(在读取框中)合并到一个提交中.我怎样才能做到这一点?

kow*_*sky 14

您正在寻找squash互动功能rebase:

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

请参阅此处获取详细说明.

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


axi*_*iac 14

有很多方法可以做到(使用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. 如果您对输出感到满意,则删除backup在步骤2(git branch -D backup)中创建的分支.
  7. 就这样.