Git提交出现在所有分支中,而不仅仅是我指定的分支

时间:2014-04-15 10:11:34

标签: git svn version-control github merge

这可能是一个相当简单的问题,我如何使用git或如何将它与Visual Studio 2012集成。我有(或者我认为)有两个主要分支:掌握和开发。

我很少接触主分支,我主要是对开发分支进行提交,当我达到里程碑时,我将开发分支与主分支合并。如果我正在介绍一个新功能,我会从开发分支中创建一个新的分支专长/ SomeFeature。完成该功能后,我将其与develop分支合并,然后将其与master分支合并。

切换分支完全符合我的预期,我看到了旧的未经修改的代码版本。但是,当我在分支可视化程序中打开repo时,似乎我的所有提交都在一个分支中:

enter image description here

我期待看到循环和合并,就像在这个截图中一样: enter image description here

为什么我的分支看起来不一样?为什么我的所有提交都出现在一个分支上?

1 个答案:

答案 0 :(得分:1)

发生了什么

如果没有更多信息,很难确切知道发生了什么,但你可能会得到fast-forward merges。基本上,如果Git可以展平合并,则默认为这样做。您主要在develop工作并将其重复合并到master的工作流程会使您快速合并。

(请注意,没有任何内容错误的与快进合并。一些开发人员喜欢这种流程并且只是通过rebase他们的工作来使用这种合并策略在合并之前。其他开发人员,包括我自己,喜欢看"合并气泡"进行功能合并。)

作为示例,请考虑以下提交图:

[master]   A---B---C
                    \
[develop]            D---E---F

master包含提交ABCdevelop包含提交ABCDEF

此时,如果将develop合并到master,Git将默认为快进合并,从而导致

[master] [develop] A---B---C---D---E---F

这是因为合并会在逻辑上导致两个树中存在相同的提交:您正在将提交DEF合并到已包含{{1}的分支上},AB

如果上一个图表看起来不同,例如

C

会发生一些不同的事情。你最终会得到这样的东西:

[master]   A---B---C---G
                    \
[develop]            D---E---F

在这种情况下,您将获得一个新的提交H,称为合并提交

保持合并气泡

您可以使用[master] A---B---C---G-------H \ / [develop] D---E---F 标记强制后一种行为--no-ff。 (还有一个git merge标志来强制相反的行为。)从第一个例子开始,--ff-only会产生类似的结果

git checkout master && git merge --no-ff develop

请注意新的合并提交[master] A---B---C-----------G \ / [develop] D---E---F

Visual Studio

这一切都是从命令行上的Git角度出发的,但我注意到你使用的是Visual Studio。假设您正在使用该工具执行合并,我不确定如何触发G选项从VS合并。遗憾的是,许多图形Git客户端隐藏了非常有用的选项,如此标志。