为什么我的主分支在压缩成为主人之后显示它的发展?

时间:2017-01-31 18:51:43

标签: git

我只是将我的整个develop history历史记录合并到我的主分支中。我认为它应该连接network graph中的两个分支,但它并没有。另外,我的主分支显示:This branch is 1 commit ahead, 151 commits behind develop.,而我预计它会在壁球合并后发展。为什么不是这样?

我如何将我的更改合并到开发中的master中,这样它只能在master上进行一次提交,甚至在开发时(在那一点上)并在网络图中连接?

2 个答案:

答案 0 :(得分:4)

壁球合并会在"我们的"上创建一个新的提交。分支(在你的情况下掌握)引入"他们的"分支(开发)好像你已经合并了两个。它实际上并不包含合并(将两个分支连接在一起的多父提交);如果这样做那将只是一个定期合并。所以git后来不能告诉开发的提交等于添加到master的新提交。

我想我还没有看到正确的用例,但我发现壁球合并有些毫无意义。据我所知,在合并和变基之间的两个世界中最糟糕的。

更新 - 根据评论,某些说明可能会有所帮助......

因此我们知道常规合并是一个包含两个或更多父项的提交。它的第一个父母是"我们的"合并中的分支(让我们说主人),我们合并的分支是额外的父母。这一次提交就是为主人提供的所有内容。

A ---- B - M
         /
X ---- Y 

所以这看似错误,因为git log将分别显示A,B,X和Y.这是默认行为,因为它向您显示了如何真正引入更改。

您可以通过说git log --first-parent来获得更加线性的视图,但log仍然不想显示合并的修补程序(meh),所以它并不相当看起来像一个线性历史,因为你从壁球或篮板中得到。

但肯定M^等于B,因此从主视角M开始,是一个引用来自分支的所有更改的提交。如果您希望它也记录XY的更改可以从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} },您可以继续使用此方法。