【发布时间】:2012-10-27 13:03:39
【问题描述】:
我正在使用 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
【问题讨论】:
-
关于你的后续问题......你的意思是失去分支 B 的提交 3?
-
对不起,我弄错了,刚刚重新编辑了。
-
啊,所以你有两个版本的 commit3(原始版本和重新定位的版本)都合并到 C 中。嗯,有一种方法可以得到你的要求(在合并,然后用新的 B) 再做一遍。然而,更好的解决方案是永远不要对在本地分支之外已经可见的提交进行变基。只需应用修复、合并它,然后停止试图掩盖你的错误——我们都会犯错......