是否可以重新定位到分支的中间(连接两端)?

时间:2018-01-25 13:34:30

标签: git git-branch rebase branching-and-merging

不重复!

我看到的所有vanilla rebase示例都是一个花哨的图表,展示了如何将分支重新绑定到另一个分支/提交的TOP上。是否可以,让分支A移动到分支B上的具体中间位置?

        O--O--O Branch B             O--0--0--O--O Branch B
       /                            /  
O--O--O--0--0   Branch A     O--O--O

编辑:我不是在寻找任意提交的变基础,而是在分支中间重新定位,连接两端

4 个答案:

答案 0 :(得分:3)

您要求从一个分支接受提交并将它们放在另一个分支的中间。 (这个措辞并没有真正与git"如何思考"关于分支和提交的关系,但我认为你的意思是清楚的,所以好吧.. 。)

FROM:

x -- x -- A -- B -- C -- F -- G <--(branch_1)
      \
       D -- E <--(branch_2)

TO:

x -- x -- A -- B -- C -- D' -- E' -- F' -- G' <--(branch_1)

(目前尚不清楚您希望branch_2引用结束的位置 - 或者您是否只想删除它 - 但提交权利是一个更大的问题,而您之后可以计算出裁判。)

重要的注意事项:在此图表中,提交D向前已替换,提交D'向前;这是因为提交不能被移动&#34;或以任何方式改变,所以我们所做的是创建新的提交。这意味着提交DEFG(原始版本)已从您的分支机构的历史记录删除如果分支被推动可能会导致问题。有关可能导致的问题以及如何解决这些问题的详细信息,请参阅git rebase文档(https://git-scm.com/docs/git-rebase);请注意,如果这些问题得不到解决,很可能另一位开发人员会无意中撤消您的工作。

那就是说,有多种方法可以解决这个问题;一般来说,你需要进行两次反叛操作。

考虑它的一种更直接的方法是,只需正常执行rebase,然后执行交互式rebase来更改提交顺序。

如果您想要更具脚本性的内容,可以从

开始
git rebase --onto branch_1~2 branch_1 branch_2

此处--onto选项指定默认值以外的新基数(默认为&#34;上游&#34的顶端;)。因为我在branch_1的父项的父项之后插入此示例中的提交,所以我可以使用branch_1~2branch_1^^作为新的基本表达式。要重写的提交是以通常的方式指定的(在这种情况下&#34;可以从branch_2到达但不能从branch_1到达)。所以你有

x -- x -- A -- B -- C -- F -- G <--(branch_1)
                     \
                      D' -- E' <--(branch_2)

现在你只是rebase branch_1以正常方式冷落到branch_2的末尾。

git rebase branch_2 branch_1

屈服

x -- x -- A -- B -- C -- D' -- E' -- F' -- G' <--(branch_1)
                                ^(branch_2)

答案 1 :(得分:3)

你的问题很模糊,幸运的是,这个图画揭示了你想要的东西。

如果我理解正确,这是回购的输入状态

        M--N--P   <-- Branch B
       /
O--O--X--Y--Z     <-- Branch A

这就是你想要实现的目标。我用字母表示提交。

        M--Y--Z--N--P   <-- Branch B
       /
O--O--X

首先,您必须创建一个指向C的新分支(M),以便在操作结束前将其保持可见

git branch C B~2

B~2替换为您从NB的实际提交数(包括两者)或使用绝对引用(现有分支或提交哈希)。

以下命令在N之上移动P - Z。它会移动B中但C之上A以外的所有提交

# Move N-P on top of Z (A points to Z, B points to P, C points to M)
git rebase --onto A C B

最后一步是移动位于B但不在C C之内的所有提交:

# Move Y-Z-N-P on top of M (B still points to P, A still points to Z)
git rebase C B

回购现在看起来像这样:

        +-- Branch C
        v
        M--Y'-Z'-N'-P'  <-- Branch B
       /
O--O--X--Y--Z           <-- Branch A

分支A仍然指向原始Z提交;原始Y提交仍然存在。当前分支为B

提交Y'Z'N'P'YZN和{{}的副本1}}。它们仅在提交日期和父级上与原始文件不同;没有代码更改。

现在可以删除分支PA。 (C)。

详细了解git rebase

答案 2 :(得分:0)

是的,有可能,你需要先

git checkout <commit>

然后重新分支你的分支,然后推送到原点。

答案 3 :(得分:0)

我首先将分支A正常地重新分支到分支B.然后我将使用git rebase -i HEAD~n(其中n是交互编辑的提交数)并重新设置提交(通过简单地改变编辑器中的行的顺序)