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

dma*_*oni 17 git rebase

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

       master    branch1   branch2
          |         |         |
o----o----o----A----B----C----D
Run Code Online (Sandbox Code Playgroud)

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

              branch1   branch2
                 |         |
            A----B----C----D
           /
o----o----o----o
               |
            master
Run Code Online (Sandbox Code Playgroud)

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

                        branch2
                           |
            A----B----C----D
           /          
o----o----o----o----A'---B'
               |         |
            master    branch1
Run Code Online (Sandbox Code Playgroud)

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

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

这确实有效:

git rebase --onto branch1 branch2^^ branch2
Run Code Online (Sandbox Code Playgroud)

这假设我知道branch2正好超过前一个branch1 ref的2次提交.

既然git rebase --onto有效,是否有一个1行的git命令会在一个新重定位的branch1之上重新绑定branch2,这样我就不必知道究竟有多少提交是branch2的一部分?(我想为中间参数指定一些魔术引用而不是branch2 ^^.)

还是有其他方法我忽略了?

我最感兴趣的是一个可以很好地扩展到极端情况的解决方案,而不仅仅是两个分支 - 假设我有更多的东西,比如5个本地分支,彼此链接在一起,我想将所有这些分开.

Von*_*onC 16

一条线:

git rebase --onto branch1 branch1tmp branch2
Run Code Online (Sandbox Code Playgroud)

这假设作出branch1tmpbranch1 基础重建branch1.

git checkout branch1
git branch branch1tmp
git rebase master
git rebase --onto branch1 branch1tmp branch2
Run Code Online (Sandbox Code Playgroud)

话虽如此,检查什么ORIG_HEAD参考.
git rebase手册页:

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

所以检查这是否有效(并且更好地扩展):

git checkout branch1
git rebase master
git rebase --onto branch1 ORIG_HEAD branch2
git rebase --onto branch2 ORIG_HEAD branch3
...
Run Code Online (Sandbox Code Playgroud)


Kac*_*che 7

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
Run Code Online (Sandbox Code Playgroud)

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

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

这可以使工作流程如下:

git rebase master branch1 # start with a normal rebase
git rebase-chain branch2 branch3 branch4 ... branchN
Run Code Online (Sandbox Code Playgroud)

奖金

假设你有bash-completion用于git

__git_complete "git rebase-chain" _git_branch
Run Code Online (Sandbox Code Playgroud)