我需要在主分支中popup并清除“中间”提交。 我该怎么做?

例如,在下面的master分支中,我只需要提交af5c7bf16e6f04321f966b4231371b21475bc4da,这是由于之前的rebase而导致的第二个:

commit 60b413512e616997c8b929012cf9ca56bf5c9113 Author: Luca G. Soave <luca.soave@gmail.com> Date: Tue Apr 12 23:50:15 2011 +0200 add generic config/initializers/omniauth.example.rb commit af5c7bf16e6f04321f966b4231371b21475bc4da Author: Luca G. Soave <luca.soave@gmail.com> Date: Fri Apr 22 00:15:50 2011 +0200 show github user info if logged commit e6523efada4d75084e81971c4dc2aec621d45530 Author: Luca G. Soave <luca.soave@gmail.com> Date: Fri Apr 22 17:20:48 2011 +0200 add multiple .container at blueprint layout commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22 Author: Luca G. Soave <luca.soave@gmail.com> Date: Thu Apr 21 19:55:57 2011 +0200 add %h1 Fantastic Logo + .right for 'Sign in with Github' 

我需要维持

  • 第一次提交60b413512e616997c8b929012cf9ca56bf5c9113,
  • 第三次提交e6523efada4d75084e81971c4dc2aec621d45530和
  • 最后一次提交414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

“扔掉”只是第二次提交af5c7bf16e6f04321f966b4231371b21475bc4da

我怎样才能做到这一点? 在此先感谢卢卡

选项是RebaseRevert 。 Rebase实际上会从历史logging中删除提交,所以它看起来像第二次提交从来没有存在过。 如果您将主分支推送到任何其他回购站,这将是一个问题。 如果你试图在这种情况下推迟rebase,git会给你一个拒绝非快进合并错误。

当分支机构与其他仓库共享时,还原是正确的解决scheme。 git revert af5c7bf16会做一个新的提交,简单地反转af5c7bf16引入的更改。 这样的历史不会被重写,你保持清楚的错误logging,其他回购将接受推。

这是擦除的一个好方法: git rebase -i <commit>^这会把你提交到你想要删除的那个之前的提交。 交互式编辑器将向您显示所有提交到这一点的提交列表。 你可以select,压扁等。在这种情况下, 删除要删除和保存文件的提交行。 Rebase将完成其工作。

如果rebase是一个选项,你可以rebase并放弃它:

 $ git rebase -i 414ceffc^ 

如果rebase不是一个选项,你可以恢复它:

 $ git revert af5c7bf16 

尽pipe在这里得到的原始答案都是相当的,但我并没有觉得他们能够圆满地回答这个问题。 如果您发现自己处于需要从历史中删除提交或提交集合的情况,那么我build议:

  • 创build一个包含所有提交的分支的新分支,并切换到它。
  • 将新分支恢复到您想从中启动新基地的位置。
  • 然后,(这里的关键点) 樱桃挑选后,实际上要从原来的分支应用到后续的提交到新的,并跳过你不想要的提交(即你正在删除的)。
  • 如果需要,将原始分支重命名为表示旧分支的东西,然后将新分支重命名为原始分支。
  • 最后,将更改推送到您的远程回购(如果使用的话)。 您可能需要使用“强制推送”。 如果您的协作者在修订版本时遇到问题,那么他们可能最容易再次从远程源克隆回购。 不pipe怎么样,如果你是从历史中间剥夺承诺的话,你可能会想和他们谈谈!

这里是樱桃采摘的信息: 樱桃采摘与git的提交是什么意思?

这里有一些与龟鳖(就像我刚刚做的那样)。 使用gui工具对于这些操作绝对容易! 樱桃采用TortoiseGit