将基于主题分支的分支的更改合并到git中的不同主题分支

时间:2011-04-21 19:35:41

标签: git git-branch git-rebase git-merge cherry-pick

我的团队正在使用git中的共享主题分支,我称之为“topic1”。我正在研究一个由topic1构成的分支上的一些代码的重构,我称之为“重构”。我一直在定期将topic1合并到重构中,因此我可以及时了解更改,但是还没有将重构合并到topic1中,因为重构仍在进行中。

还有另一个主题分支,我称之为“topic2”,最近是由master创建的。我想要做的是将仅仅我在“refactor”上所做的更改合并到一个由topic2构成的新分支,我将其称为“topic2_refactor”。 (I.E.提交中的更改只能由重构访问,但不能通过topic1访问。)

我知道如何看待这些变化:

git log origin/refactor --not origin/topic1

所以我想做的就是这样 - 但这种语法不正确:

git checkout topic2
git checkout -b topic2_refactor

然后这个:

git merge origin/refactor --not origin/topic1

或者这个:

 git cherry-pick origin/refactor --not origin/topic1

(上面似乎导致合并冲突不是必要的,因为在master上发生了一些后来合并回到重构分支的更改。)

我希望有一种干净的方法可以做到这一点,并避免在“重构”分支的历史中稍后解决的不必要的合并冲突。这可能是使用git rebase,git filter-branch等吗?

1 个答案:

答案 0 :(得分:2)

您可以使用--onto选项尝试git rebase。这是什么允许是底垫操作抓住它需要从你的“重构”分支应用的diff,以关闭“TOPIC1”,但随后将其应用到“标题2”

git co refactor
git co -b topic2_refactor
git rebase --onto topic2 topic1 # bases the diffs off of topic1, but applies them to topic2

您的成功可能会有所不同。可能仍然存在有问题的冲突。这样做的缺点是,您将会有两个单独的分支重构具有相同的变化,但由于这是一个重订,他们有着不同的历史,如果你不小心,可以很容易发散(你必须从一个不断挑樱桃分支到另一个或类似的东西)。

然后,当topic1和topic2(重构后)需要再次合并到master中时,你可能遇到麻烦,因为他们将拥有所有那些相同的重构提交。虽然git通常很不错。

因为它似乎重构是独立于这些话题的分支,我会考虑的重订重构分支关老爷的,所以当重构完成后,您可以合并这些变化到这两个主题。