答案 0 :(得分:11)
您正在寻找互动squash
的{{1}}功能:
使用rebase
启动交互式rebase。在开始编辑器中,列出了作为rebase一部分的所有提交。在这种情况下,由于我们为git rebase -i HEAD~2
调用提供了HEAD~2
参数,因此我们看到两个提交,每个提交都以rebase
为前缀。不改变任何东西会导致rebase到pick
,即应用两个提交,没有什么会有所不同。相反,你想做的是pick
只有一次提交,而pick
另一次提交。这样,您将第二个提交压缩到第一个提交,从而导致单个提交。当你安全并立即退出时,git将提示你提交一个新的提交消息,并且voilà:一个包含两个旧提交的更改的新提交。
有关详细说明,请参阅here。
一如既往地搞乱历史(就像将不同的提交压缩成新的一样),你应该只对那些你确定没有人根据其工作的提交执行这样的操作。
答案 1 :(得分:10)
有很多方法可以做到(使用rebase
或reset
)。
使用git reset
的方法:
git status
查找。如果存在未提交的更改,请将它们保存在存储区中(git stash
或将其提交到临时分支。git branch backup
以在当前提交上创建备份分支
它并不是真正需要的(使用reflog
或通过写下当前提交的哈希值可以实现相同的结果),但如果出现问题,这是恢复当前状态的最简单方法。git reset --soft HEAD~2
。HEAD
两次提交(在提交e8de117
上)而不更改工作树或索引。索引和工作树现在看起来就像是在创建提交6aa74e4
之前。最后两次提交中更改的所有文件都已添加到索引中。由于HEAD
位于e8de117
,因此下一次提交将在e8de117
之上创建(它将“替换”提交6aa74e4
和77c15d6
)。git commit
。您必须输入新的提交消息。git diff backup
不应该报告任何差异)或者您已经改变主意,请运行git reset --hard backup
以返回您开始的位置(实际上,正确在步骤#2之后。git branch -D backup
)创建的backup
分支。