3

我正在使用 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
4

2 回答 2

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)似乎在语义上是您正在寻找的。

于 2012-11-07T13:17:34.777 回答
2

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

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

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

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

但是,您可以这样做:

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

通过创建一个合并分支 A 和 B 的合并提交 (m),然后在此基础上重新设置 C。

于 2012-11-07T14:31:30.230 回答