git - 从多个分支机构变基础

时间:2012-11-07 13:00:34

标签: git branch rebase

我正在与3个分支机构合作,我想同时从另外两个分支机构重新分支一个分支。


我得到了什么

git log --graph --decorate --pretty=oneline --abbrev-commit

如下:

分支A:

* f751d1a (A) commit2
* 4e552f3 (master) commit1

分支B:

* 3770d35 (B) commit3
* 4e552f3 (master) commit1

分支C,我首先从A中重新定位,然后是B:

* 9740b0e (HEAD, C) commit4
* a280f0a commit2                   //same commit name but different sha code
* 3770d35 (B) commit3
* 4e552f3 (master) commit1

当我表演时

git checkout C
git rebase A

我得到了以下内容:

* 2e08816 (HEAD, C) commit4
* bbc77ad commit3                   //different sha-code
* f751d1a (A) commit2
* 4e552f3 (master) commit1

当我表演时

git checkout C
git rebase B

我得到了以下内容:

* bf67d55 (HEAD, C) commit4
* f69ecdd commit2                   //different sha code
* 3770d35 (B) commit3
* 4e552f3 (master) commit1

然而,我真正需要的是制作C分支

* 1234567 (HEAD, C) commit4
* 3770d35 (B) commit3
* f751d1a (A) commit2
* 4e552f3 (master) commit1

不改变分支A和B.

我做了一些研究,但无法想办法。 是否有可能实现这一目标?

换句话说,我该如何转换

master---A
      \
       B---C
or

master---B
      \
       A---C

       A
      /
master---B
      \
       A---B---C

or something like this.

提前致谢...

其他问题:

谢谢你,(@ Brian Phillips,@Useless)!合并后,它看起来像我想要的工作。但是,后来,我在B中做了一个提交,用git rebase master -i用行进行了“修复”。

pick 3770d35 commit3
fixup 3cbf79d commit4

它跟随git merge B

*   5fa9192 (HEAD, C) Merge branch 'B' into C
|\  
| * 147258a (B) commit3 //changed content after fixup
* |   7768962 Merge branch 'B' into C
|\ \  
| * | 3770d35 B commit3
| |/  
* | f751d1a (A) commit2
|/  
* 4e552f3 (master) commit1

同样使用git rebase B,它变为:

* 0e1355b (HEAD, C)
* 147258a (B) commit3 //changed content after fixup
* 4e552f3 (master) commit1

有没有办法让它像:

*  (HEAD, C) 5454215 Merge branch 'B' into C
|\ 
| * 147258a (B) commit3 //changed content after fixup
| |  
* | f751d1a (A) commit2
|/  
* 4e552f3 (master) commit1

2 个答案:

答案 0 :(得分:2)

由于git的SHA1提交ID不仅基于提交的内容而且还基于这些提交的时间和祖先(以及其他内容)创建,因此您所要求的是不可能的。提交ID 3770d35不能作为其他任何内容存在,除了它的开头(缺少SHA-1哈希冲突)。如果您感兴趣这个主题,您可能想要阅读更多关于git内部的信息(http://git-scm.com/book/en/Git-Internals-Git-Objects可能对初学者有好处。)

我建议你不要过多地提交ID并更多地考虑提交内容(如果感兴趣的话,请考虑订购)。您在上面列出的第一次尝试(git checkout C; git rebase A)似乎在语义上是您正在寻找的。

答案 1 :(得分:2)

当您进行rebase时,您使用相同的内容创建 new 提交,但 new 元数据(祖先等)。所以,你不能轻易地使用rebase来做到这一点。

让我们来看看你的目标状态:

           2 [A]
          /
1 [master]--- 3 [B]
          \
           2 -- 3 -- 4 [c]

(我重写了它,显示你的提交和分支名称)。这是不可能的,因为有两个提交3的副本具有不同的元数据(它们具有不同的父提交)。

但是,你可以这样做:

           2 [A] ----
          /           \
1 [master]--- 3 [B] -- m -- 4 [C]

创建一个合并提交(m),它将分支A和B组合在一起,然后在其上重新定位C.