如何重新设置本地git分支链的基础?

如何重新设置本地git分支链的基础?,git,rebase,Git,Rebase,假设我有一个本地git分支链,如下所示: master branch1 branch2 | | | o----o----o----A----B----C----D 我将上游变更引入主分支: branch1 branch2 | | A----B----C----D / o----o----o--

假设我有一个本地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
请注意,由于branch1的重定基址,提交A和B已重写为A'和B'

我的问题是:现在我想重新设置branch2的基础。显而易见的语法是git-rebase-branch1-branch2,但这显然不起作用。我想要它做的只是在branch1的顶部重新应用C和D,但它试图调和A和A’,并且认为它们相互冲突

这确实有效:

git rebase --onto branch1 branch2^^ branch2
这假设我知道branch2在前一个branch1引用之外有2个提交

既然
git-rebase--on
可以工作,那么有没有一行git命令可以将branch2重新设置到新重新设置的branch1之上,这样我就不必确切知道branch2中有多少次提交了?(我想为中间参数指定一些magic ref,而不是branch2^^^。)

还是我忽略了其他方法

我最感兴趣的是一种能够很好地扩展到极端情况的解决方案,而不仅仅是两个分支——假设我有5个类似于本地分支的东西,它们彼此链接在一起,我想将它们重新组合在一起。

一行:

git rebase --onto branch1 branch1tmp branch2
假设在重新设置
branch1
的基址之前,在
branch1
上生成
branch1tmp

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

话虽如此,请检查原始头引用的内容。
发件人:

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

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


我喜欢的是
git签出分支;git rebase-i master
直接在编辑器中显示
branch1
,然后在保存编辑器时,branch1会相应地更新。因此,我可以在git rebase-I中直接将提交从branch2移动到branch1,并使用“stick”。可能是用“--重新设置分支”之类的

所以,啊,我分担你的痛苦

我所做的是模仿这一缺失特征的黑客行为。我经常发现,在创建长寿分支的过程中,我不断地积累在“这个”分支之前应该进入master的内容。修复编码标准漏洞、发现并修复明显错误、现有代码的文档更新等。这就是我使用您的
branch1
的目的。然后,实际上是我的新功能的一部分的提交进入
branch2

因此,我要做的不是创建
branch1
分支,而是创建
branch1
伪分支“标记”——一个很小的提交,稍后我将使用
git-rebase
丢弃它。我创建它的方式如下:

touch marker.master
git add marker.branch1
git commit -m "*** BRANCH1 ***" marker.branch1
现在,当我创建提交时,我混合了应该在这个分支之前进入master的提交和这个实际分支的“新”提交

当需要清理/重设基础时,I
git-rebase-I master
。现在,我的
***BRANCH1***
提交在提交列表中很明显,我可以将目标为
BRANCH1
的提交移动到该“行”上方

因为我没有实际的
branch1
分支,
git-rebase-master
完全按照我的要求执行,它将
branch2
和我的
branch1
伪分支标记作为一个单元移动

当我完成重定基址并准备推送时,我手动记录
***BRANCH1***
的提交ID,说
abcdef1
,然后:

git checkout -b branch1 abcdef1^
然后:

并删除
abcdef1
commit

通过这种方式,我可以在
git rebase-I
期间轻松地在我的
branch1
branch2
分支之间移动提交,并且只在最后实际创建一个真正的git
branch1
分支

但是哦,我真的很想让git rebase-I为我做这件事

git rebase主分支1
git rebase——安装在头部或头部支管2上
git rebase——在头部或头部分支上3
# ...
git rebase——头上或头上
我有一个git alias脚本来执行此操作:

rebase chain=“!f(){\
对于${@};中的i\
git rebase——头上的ORIG_头$i\
完成\
};f“
这可以使工作流类似于:

git rebase master branch1#从正常的rebase开始
git再基链分支2分支3分支4。。。布兰奇
奖金

假设您对
git
完成了
bash

\uuuuu git\u完成“git重基链”\ugit\u分支

这个问题是

我最近开始使用这一工具来解决这个问题

基本上是指定一个链

git chain setup -c myfeature master branch1 branch2
一旦建立了这个链,您就可以从
master
中拉入提交,然后运行
git chain rebase-c myfeature
,该工具会为您计算出所有的引用并对所有内容进行重新设置


作为一个额外的好处,它还计算并处理对
branch1
branch2
的任何修改或新提交。在
master
上重新设置
branch1
的基础时,是否存在冲突?在一般情况下,
git-rebase-branch1-branch2
将按预期工作,但在某些情况下可能无法工作,例如,如果您在
master
上对
branch1
重新设置基址时必须解决冲突。谢谢!ORIG_HEAD看起来是最自然的方式。有趣的别名脚本+1.
git checkout branch2
git rebase -i branch1
git chain setup -c myfeature master branch1 branch2