假设我的Git存储库最初有两个分支:Foo和Bar。
... ─ Foo ... ─ Bar
我创建了第三个分支,FooBar,我在其中提交了另外两个分支的合并。
... ─ Foo ──┐ FooBar ... ─ Bar ──┘
FooBar现在是Foo和Bar之前的一次提交。接下来,我做了一些工作,仅在Foo上做了几次。
... ── A ───┬── B ── C ── D ── Foo FooBar ... ─ Bar ──┘
问题是:由于分支FooBar的第一个父亲不再是Foo,我可以在分支FooBar中重新合并提交以再次将Foo和Bar作为其两个父母吗?换句话说,我可以将Foo中的开发项目与未更改的Bar一起合并到之前合并的FooBar中吗?
... ── A ── B ── C ── D ── Foo ──┐ FooBar ... ─ Bar ───────────────────────┘
答案 0 :(得分:12)
我意识到这是一个相当古老的主题但是因为我在面对类似的情况时发现了这个问题,我还可以告诉我到底使用了什么。
git checkout FooBar
git rebase -p --onto Foo A
我尝试使用原始问题中的名字。请特别注意,A
表示在ascii art中标记为A的提交。您可能会使用提交的哈希值或任何其他方式指向分支Foo
和FooBar
最初分离的提交。
-p
标记也称为--preserve-merges
,它的功能与它所说的非常相似。
请注意,分支Bar
在这里不起作用,因此提交行可能是命名分支,或者不是 - 它没有区别。
答案 1 :(得分:1)
如果不更改定义FooBar
的内容,则无法在分支FooBar
下进行变基。您可以做的是合并FooBar
和Foo
。这将具有您想要的相同内容。
答案 2 :(得分:0)
你基本上试图删除之前合并的所有痕迹。
如果你真的想要丢弃只存在于FooBar
(和工作目录)中的所有提交,那么按以下步骤操作:首先执行git checkout FooBar
,然后让git忘记它的历史记录和执行git reset --hard Foo
(如果您打算将Bar
合并到Foo
)。然后使用git merge Bar
重新创建合并。