我只是将我的整个develop history历史记录合并到我的主分支中。我认为它应该连接network graph中的两个分支,但它并没有。另外,我的主分支显示:This branch is 1 commit ahead, 151 commits behind develop.
,而我预计它会在壁球合并后发展。为什么不是这样?
我如何将我的更改合并到开发中的master中,这样它只能在master上进行一次提交,甚至在开发时(在那一点上)并在网络图中连接?
答案 0 :(得分:4)
壁球合并会在"我们的"上创建一个新的提交。分支(在你的情况下掌握)引入"他们的"分支(开发)好像你已经合并了两个。它实际上并不包含合并(将两个分支连接在一起的多父提交);如果这样做那将只是一个定期合并。所以git后来不能告诉开发的提交等于添加到master的新提交。
我想我还没有看到正确的用例,但我发现壁球合并有些毫无意义。据我所知,在合并和变基之间的两个世界中最糟糕的。
更新 - 根据评论,某些说明可能会有所帮助......
因此我们知道常规合并是一个包含两个或更多父项的提交。它的第一个父母是"我们的"合并中的分支(让我们说主人),我们合并的分支是额外的父母。这一次提交就是为主人提供的所有内容。
A ---- B - M
/
X ---- Y
所以这看似错误,因为git log
将分别显示A,B,X和Y.这是默认行为,因为它向您显示了如何真正引入更改。
您可以通过说git log --first-parent
来获得更加线性的视图,但log
仍然不想显示合并的修补程序(meh),所以它并不相当看起来像一个线性历史,因为你从壁球或篮板中得到。
但肯定M^
等于B
,因此从主视角M
开始,是一个引用来自分支的所有更改的提交。如果您希望它也记录X
和Y
的更改可以从M
访问,那么这就是git提供的更改。
现在你可能已经认识到我不太喜欢merge --squash
,所以这就是原因:
让我们说我做了一次壁球合并而不是上面描述的常规合并。为清楚起见,我将添加一个共同的祖先O:
O ---- A ---- B ---- XY <--(master)
\
X ---- Y <--(development)
现在开发上还有一些工作
O ---- A ---- B ---- XY <--(master)
\
X ---- Y ---- Z <--(development)
那么我如何才能最好地将Z合并到我的主分支?
如果我已经将Z定期合并到主人那里,那么git会知道Y是Z和M的共同祖先(但是我没有M;我做了一个壁球所以我有XY),我可以做另一个没有问题的合并。
如果我将我的开发分支重新设置为主人,我就
O ---- A ---- B ---- X' ---- Y' <-- (master)
\
Z <-- (development)
这也没关系,只要我的基础没有弄乱任何其他人的历史(如果X和Y已经发布,它可能会发生,但那个&#39;另一种蠕虫病毒。)
在这两种情况下,我都可以进行另一次合并或改造,没有任何问题。但是通过进行南瓜合并,我把git混淆了看两条历史之间没有良好记录关系的历史,所以除非我保留一个指向Y的参考,否则我运气不好
O ---- A ---- B ---- XY <--(master)
\
X ---- Y ---- Z <--(development)
^- (last_merge)
并且,正如您已经注意到的那样,如果您走这条路,git status
将永远感到困惑。
答案 1 :(得分:0)
如果您真的想使用此方法,则在master
的每次壁球合并之后,只有一种方法可以将dev
合并回master
,而不是{{1} },您可以继续使用此方法。