我如何改变一系列本地git分支?

时间:2013-12-30 06:45:34

标签: git rebase

假设我有一系列本地git分支,如下所示:

       master    branch1   branch2
          |         |         |
o----o----o----A----B----C----D

我将上游更改引入主分支:

              branch1   branch2
                 |         |
            A----B----C----D
           /
o----o----o----o
               |
            master

现在我改变了branch1,给了我这个:

                        branch2
                           |
            A----B----C----D
           /          
o----o----o----o----A'---B'
               |         |
            master    branch1

请注意,由于rebase branch1,提交A和B已被重写为A'和B'。

这是我的问题:现在我想要rebase branch2。显而易见的语法是git rebase branch1 branch2,但这绝对不起作用。我想要它只是在branch1上重新应用C和D,而是尝试协调A和A',并认为它们是冲突的。

这确实有效:

git rebase --onto branch1 branch2^^ branch2

这假设我知道branch2恰好有2个提交超出了前一个branch1 ref。

由于git rebase --onto有效,是否有一个单行git命令会在一个新重定位的branch1之上重新绑定branch2,这样我就不必确切知道有多少提交属于BRANCH2? (我想为中间参数指定一些魔术引用而不是branch2 ^^。)

或者我还有其他方法可以忽略吗?

我最感兴趣的是能够很好地扩展到极端情况的解决方案,而不仅仅是两个分支 - 假设我有更多像5个本地分支的东西,所有分支都相互链接,我想将它们全部重新组合在一起

3 个答案:

答案 0 :(得分:15)

一行:

git rebase --onto branch1 branch1tmp branch2

假设在重新定位branch1tmp之前在branch1 上制作branch1

git checkout branch1
git branch branch1tmp
git rebase master
git rebase --onto branch1 branch1tmp branch2

话虽如此,检查ORIG_HEAD引用的内容 来自git rebase man page

  

ORIG_HEAD设置为在重置之前指向分支的尖端。

因此,请检查这是否有效(并且更好地扩展):

git checkout branch1
git rebase master
git rebase --onto branch1 ORIG_HEAD branch2
git rebase --onto branch2 ORIG_HEAD branch3
...

答案 1 :(得分:3)

git rebase master branch1
git rebase --onto HEAD ORIG_HEAD branch2
git rebase --onto HEAD ORIG_HEAD branch3
# ...
git rebase --onto HEAD ORIG_HEAD branchN

我有一个git别名脚本来执行此操作:

rebase-chain = "!f() { \
  for i in ${@}; do \
    git rebase --onto HEAD ORIG_HEAD $i; \
  done; \
}; f"

可以使工作流程像:

git rebase master branch1 # start with a normal rebase
git rebase-chain branch2 branch3 branch4 ... branchN

<强>奖金

假设bash-completiongit

__git_complete "git rebase-chain" _git_branch

答案 2 :(得分:0)

这个问题是Modify base branch and rebase all children at once

的子集

我最近开始使用git-chain,它是解决此问题的工具。

基本上,您可以指定一条链条

git chain setup -c myfeature master branch1 branch2

一旦建立了此链,您可以从master提取提交,然后可以运行git chain rebase -c myfeature,该工具会找出所有引用并为您重新调整所有内容。

作为一项附加好处,它还可以计算并处理对branch1branch2的任何修订或新提交。