2011-04-21 293 views
2

我的团队正在研究git中的共享主题分支,我将称其为“topic1”。我正在研究一个由topic1构成的分支上的一些代码的重构,我将称之为“重构”。我一直在定期将topic1合并到重构中,以便能够随时更新变化,但是尚未将重构合并回topic1,因为重构仍在进行中。将基于主题分支的分支的更改合并到git中的其他主题分支

还有一个主题分支,我将其称为“topic2”,它最近由主人创建。我想要做的只是合并我对“重构”所做的更改由topic2创建的新分支,我将其称为“topic2_refactor”。 (IE的变化只能通过重构访问,但不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 

(以上似乎导致合并不属于neccessary,由于一些变化,这在发生主,后来合并到重构分支冲突。)

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

回答

2

您可以尝试git rebase--onto选项。这是什么允许是底垫操作抓住它需要从你的“重构”分支应用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 

您的成功可能会有所不同。仍然可能发生有问题的冲突。这个缺点是你现在有两个单独的重构分支,它们有相同的变化,但是因为这是一个rebase,他们有不同的历史,如果你不小心就很容易发生分歧(你必须经常从一个樱桃中挑选一个分支到另一个或类似的东西)。

然后当两个TOPIC1和标题2(重构)之后需要再次合并为大师,因为他们将有那些相同的重构提交你可能会遇到麻烦。虽然git通常相当不错。

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

+3

您的最后一段是一些最好的建议。始终从您打算合并到其中的所有东西的共同祖先开始分支。 – Cascabel 2011-04-21 20:31:05

+0

谢谢,我会在当地的一家分店尝试。重构分支由topic1构成的原因在于,它是topic1中引入的代码的实验重构,在创建分支时还没有合并到master中(topic1已经合并到master中,但它的意图更多作为一个长期发展的分支,所以它的历史再次与主人分离。) – Eliot 2011-04-21 20:55:50

+0

'git rebase --onto topic2 origin/topic1'似乎没有效果。 在我咨询了我的git书之后,我尝试了'git rebase --onto new_refactor origin/topic1 origin/refactor'这看起来会产生相同的合并冲突,当我尝试在我的问题中使用cherry-pick命令初始合并更改时,我已经在历史中进一步手动解决了冲突。 :( – Eliot 2011-04-21 21:05:03

相关问题