GIT:将多个提交加入到主分支上,同时保留测试分支上的所有提交

时间:2012-08-03 17:15:11

标签: git git-merge git-rebase

我有一个提交a1,a2,a3,a4的测试分支。我想将更改带到主分支,但只有一个提交而不是四个。所以我做了:

git checkout master
git merge -Xtheirs test
git rebase -i a1

squash a4
squash a3
squash a2
pick a1

因此,在master分支上,我得到了一个提交b1,其中包含来自a1,a2,a3,a4的更改。 这是第一次完成时工作正常。然后我继续我的测试分支,添加提交a5,a6,a7,a8。我检查了掌握并再次合并 - 我必须解决这些奇怪的冲突,因为a5是a4的延续,因此也是b1的延续。请注意,a4和b1上的git diff未输出任何差异。 然后我试图从a5重新定义,甚至还有更多的冲突。

所以看起来git rebase不是我需要的。加入提交后,git将a4和b1视为具有不同历史的不同提交对象,甚至更糟糕的是图中的不同位置。

我想要像:

b0 --- b0
|       |
a1      |
|       |
a2      |
|       |
a3      |
|       |
a4 ---- b1
|       |
a5      |
|       |
a6      |
|       |
a7      |
|       |
a8 ---- b2
|       |   
a9      |
|       |
... --- b3

这甚至可能吗?

注意,我可以为每组提交创建一个分支,即一个用于a1,a2,a3,a4然后执行合并和rebase与master并从b1创建另一个分支用于提交a5,a6,a7,a8和然后与master进行合并和rebase以获得b2等等。 但这不是我想要的 - 每天都有一个分支是不可取的。我想只有两个分支 - 一个包含所有提交的测试分支和一个具有更粗糙粒度的主分支。因此,当我推动大师时,他们不会看到我所做的每一点改变。

2 个答案:

答案 0 :(得分:4)

也许您想将--no-ff选项与git merge一起使用?这样你总是得到一个合并提交而不是git做提交的快进合并。在您的情况下,b0b1,...将是合并提交。

编辑:在没有合并冲突的情况下,主分支上不可能只有b0,b1提交。但如果没有必要隐藏中间提交,上面是一个很好的选择。 一般情况下,您要么进行rebase和/或挑选并处理冲突或推送所有提交对象而不必处理冲突。

答案 1 :(得分:1)

master上,您可以git cherry-pick a1..a4然后在master中压缩这些新提交。这将使测试分支中的提交保持不变,并允许您推送master,以便其他人不会看到您所做的每一个更改(根据您的要求)

当然,在这种情况下,b1和a4将是两个不同的提交。实际上,b1和a4永远不会是同一个提交。如果您希望图形工具指向a4中的b1,则必须使用Mattias上面提到的--no-ff合并。