我有一个提交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等等。 但这不是我想要的 - 每天都有一个分支是不可取的。我想只有两个分支 - 一个包含所有提交的测试分支和一个具有更粗糙粒度的主分支。因此,当我推动大师时,他们不会看到我所做的每一点改变。
答案 0 :(得分:4)
也许您想将--no-ff
选项与git merge
一起使用?这样你总是得到一个合并提交而不是git做提交的快进合并。在您的情况下,b0
,b1
,...将是合并提交。
编辑:在没有合并冲突的情况下,主分支上不可能只有b0,b1提交。但如果没有必要隐藏中间提交,上面是一个很好的选择。 一般情况下,您要么进行rebase和/或挑选并处理冲突或推送所有提交对象而不必处理冲突。
答案 1 :(得分:1)
在master
上,您可以git cherry-pick a1..a4
然后在master
中压缩这些新提交。这将使测试分支中的提交保持不变,并允许您推送master
,以便其他人不会看到您所做的每一个更改(根据您的要求)
当然,在这种情况下,b1和a4将是两个不同的提交。实际上,b1和a4永远不会是同一个提交。如果您希望图形工具指向a4中的b1,则必须使用Mattias上面提到的--no-ff
合并。