如何在分支的root提交之前添加新的提交?

时间:2016-01-08 17:27:06

标签: git

我有一个包含2个提交的分支。我需要在它们之前添加第三次提交。通常我只是添加一个新的提示提交,执行git rebase -i然后将其移到顶部(使其成为分支上的第一个提交)。但是,我不能这样做,因为问题的具体更改会影响前两次提交更改的代码,我需要在这些更改之前进行此更改(以避免不必要的冲突)。

目前,我能够做到这一点的唯一方法是大致这样做:

  1. $ git rebase -i origin/master
  2. 将最高提交标记为编辑(最早提交)
  3. $ git reset --soft @^
  4. $ git stash save 'Last commit'
  5. 进行一些代码更改
  6. $ git commit -am 'New commit'
  7. $ git stash pop
  8. $ git commit -aC @{2}(再次使用相同的消息提交先前的提交)
  9. $ git rebase --continue(直到完成)
  10. 这是很多步骤,而且很麻烦。能够在我的分支第一次提交之前标记提交作为编辑然后只是提交就可以了。但是,如果我的merge-base是合并提交,那将无效。我试过这个:

    $ git rebase -i origin/master^
    

    我也尝试过:

    $ git rebase -i origin/master^2
    

    合并中的父母双方都作为我的基础。但是,我在todo文件中得到了大量的额外提交,我不知道为什么。

    实现这一目标的简单直观方法是什么?

2 个答案:

答案 0 :(得分:1)

可以使用cherry-pick

完成

步骤1.记录3个提交的sha(例如,它们是A1,B1和C1)

步骤2.从相关分支执行以下操作(在下面的示例中,我假设它已经从原点/主分支出来)

git reset --hard origin/master
git cherry-pick C1
git cherry-pick A1    
git cherry-pick B1    

答案 1 :(得分:1)

我在git邮件列表上问了同样的问题,发现了一个非常可爱的解决方法。在交互式rebase的TODO文件中,只需在顶部添加exec false

exec false
pick 123abc Commit 1
pick 456xyz Commit 2

exec将执行给定的shell命令。 false导致非零返回码,rebase将其解释为失败并在下次提交之前停止rebase,允许您直接进行提交。然后你可以正常git rebase --continue