Git在当前分支上的另一个分支的交互式rebase但不在HEAD上

时间:2016-02-09 00:36:51

标签: git git-rebase

我想知道是否有办法从一个分支到当前分支而不是头部进行交互式变基。有点像git rebase -i otherbranchgit rebase -i HEAD~2的组合。

我想要做的是提供一个交互式rebase文件,我不仅可以安排来自远程分支的提交,还可以安排从头部开始的当前分支上的一系列提交。

我的情景是:

  • 我有功能分支B1
  • 在等待代码审查时,我从B1分支开始了一项新功能。新分支是B2
  • 代码审查终于发生了,我不得不在B1
  • 中解决问题
  • 通过修改(不是新提交)
  • 将更改应用于B1

现在我需要使用B1中的修订提交来更新B2。我希望修改提交以替换原始提交。

简单地将B1重新定位到B2将导致原始和修订后的提交出现在B2的历史中(并且可能会出现一些令人讨厌的合并冲突)。

如果我可以在交互式rebase提示符中获得B1唯一提交和一系列B2提交,那么我可以告诉git丢弃旧版本的提交并在一个操作中使用B1中的新提交。

所以它看起来像:git rebase -i B1 HEAD~2

目前我通过将B1分支到temp然后从B2中挑选新的提交到其上来执行此操作,擦除B2然后将temp移至B2。哪个好我猜...但如果我能把它作为一个rebase的一部分,它会更好(我认为)。

2 个答案:

答案 0 :(得分:1)

@jthill指出,这是git rebase -i --onto的情况。要了解你的工作,请点击gitk - 所以如果你有:

A - B - c - D    B2
     \
      C'         B1

(其中C'是您的修改提交)您只需发出git rebase -i --onto C' C B1,其中C,C'是提交的SHA(或您在提交中签出的临时分支名称),它们是 <来自rebase的strong>排除 。注意-i并不是严格需要的,但是如果遇到冲突,最好是在解决它们时使用交互式rebase(允许你编辑提交消息,而非交互式只会接受解决方案并继续前进) ,虽然很多比交互式的更快

结果:

A - B - c - D    reflog
     \
      C'         B1
       \
        D'       B2

同样,如果你有:

A - B - c - D - E    B2
     \
      C' - D'        B1

所以你修改了提交C,所以提交D也改了(虽然它的内容是相同的) - 问题git rebase -i --onto D' D B1

Rebase是最重要的git命令IMO,将代码编写到它应该的级别,您可以按任何顺序在任何地方应用您的更改。

在提问时,请务必发布上述图表。

答案 1 :(得分:0)

重新确定cherry-pick依次提交一些提交。在git rebase -i中编辑的文件指定了要提交的提交内容以及顺序。

我们甚至可以在B1中用另一个提交替换一个提交,没有临时分支,例如:

# this is the file get edited in `rebase -i`
# pick commit-in-B2        # the default when rebasing B2, comment out it
pick commit-in-B1          # instead pick the amended commit in B1
pick rest-of-B2