交互式rebase:在一堆--no-ff合并中修改最近的提交

时间:2013-04-21 03:02:26

标签: git merge git-rebase git-flow

目标

我想使用rebase修改最近的提交。魔术命令是git rebase -i

假设您正在尝试删除提交问题

  
      
  • 首先,找出提交的回程(大约)。然后做:      
        
    • git rebase -i HEAD~10
    •   
  •   


- 来源
Greg Hewgill's answer对于一个不那么复杂的git问题


问题

这非常有效,除非你最近做过任何事情--no-ff合并

如果您碰巧关注git flow,那么您可以随时进行-no-ff合并

  
      
  • 请查看下面的“来源”部分,了解如何& 为什么的rebase -i炸毁--no-ff合并
  •   
  • 现在,只要相信我(或亲自尝试):它不是很好。
  •   


实际问题

如果我们查看this page,我们会看到--preserve-merges(或简称-p)选项,我们可以尝试将-i替换为

问题是,如果我们这样做,我们就不再在之前提供好-i弹出窗口了 - >选择“编辑此提交,sqaush那一个”等的选项 - >因此,我们无法达到我们最初的目标:使用rebase修改/删除一些最近的提交:(

那么,我们该怎么办?


<小时/>

来源

问题部分:

  
      
  • First example rebase谋杀--no-ff承诺
  •   
  • Second example      
        
    • 他的引述:“TL; DR版本是这样的:当变基时,总是使用-p标志
    •   
  •   

2 个答案:

答案 0 :(得分:1)

-p-i不是互斥的 - 您可以同时使用它们。 然而在执行此操作时要非常小心 - 更改提交顺序是一个错误的想法。您也不应该尝试以这种方式删除合并提交;让事情陷入不正常的状态非常容易。

git rebase -p -i HEAD~10

答案 1 :(得分:1)

以上使用-p-i一起是正确的 - 但是我想指出你不需要使用交互式更多来摆脱提交。您可以使用--onto来明确说明您希望基数的位置。假设你想摆脱HEAD~10,......

git rebase --onto HEAD~11 HEAD~9 HEAD

这就是说,接受HEAD 的任何提交,但HEAD~9中的**不是*,并将它们应用到HEAD~11的末尾。这意味着它会跳过HEAD~10。上面的解决方案运行得很好,但有时候,为了摆脱更大的历史记录,你可能想要使用--onto。请注意,与-p一样,您也可以使用--onto的交互模式。

关于non-fast-forward merges and rebasing, take a look at this回答我给了另一个问题。它主要解释了--onto的用法,但是如果你仔细阅读,你会找到关于--no-ff合并和变基的解释。