git - 从多个分支 rebase

标签 git branch rebase

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


我得到了什么

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)! merge 后,它似乎按照我想要的方式工作。但是,后来,我在 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

最佳答案

当你 rebase 时,你创建了一个新的提交,其中包含相同的内容,但新的元数据(祖先等)。因此,您不能简单地使用 rebase 来执行此操作。

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

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

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

但是,您可以这样做:

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

通过创建 merge 分支 A 和 B 的 merge 提交 (m),然后在其上重新设置 C。

关于git - 从多个分支 rebase ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13270316/

相关文章:

git - 无法在Docker容器中找到软件包

svn - Tortoise SVN 合并 - 新中继到分支

xcode - Git pull 后 Xcode 看不到项目中的文件

git merge 但保持传入的更改未暂存

ruby-on-rails - 无法运行上限生产部署:使用 Net::SSH::AuthenticationFailed 初始化:用户身份验证失败?

git - 为什么工作目录中的文件在 Git 分支之间切换时会获得修改状态?

git - 从 master 分支中删除单个 merge 分支

Git:持续集成,避免 rebase 困惑

git - Git如何选择重新设定基准的起点?

git - rebasing 分支,有自己的分支