Git:无法理解为什么主分支(master)上会发生分支(topic)提交/合并

6
注意:我不确定是否已经有人提出了这个问题,因为我找不到任何符合我的上下文的问题(或者我无法理解现有问题的上下文)。
我最近很喜欢Git。特别是主题分支。我正在开发一个小型的代码共享应用程序。我有像“master”、“authentication”、“bookmarks”、“comments”、“nose”等本地分支...
我的(预期的)工作流程大致如下:创建主题分支==>在主题分支上工作==>将文件提交到分支==>将主题分支更改合并到“master”分支。(然后删除主题分支)
我尝试对几个分支做同样的事情。它运行良好。但后来当我检查git图表时,即使我遵循相同的工作流程,所有更改都发生在“master”上。没有树线分叉和汇聚!从那时起,它显示一条单独的线,有多个提交。我不确定为什么?我的印象是,我搞乱了HEAD指针?
为了给出实际的视图,这是我的git图表:http://github.com/none-da/zeshare/network 这里是我使用的命令:
>> git branch authentication_feature
>> git checkout authentication_feature
>> # I work with all the files here in "authentication_feature" branch
>> git commit -m "Authentication_feature is up" # commiting to the branch
>> git branch # just to confirm, which branch I am working on
>> git checkout master # trying to shift to master branch
>> git merge --no-commit authentication_feature # I merge in two steps. This is step 1
>> git status;git add; git commit -m "Authentication_feature" merged to "master". # This is the step 2
>> git log --graph --pretty=oneline # confirming the graph
>> git push origin master # pushing to the remote server(github)

你的链接对我来说无法使用。你是如何创建这个分支的?我认为我们需要更多信息,例如你使用了哪些命令。 - Mike Pape
很抱歉,这里提供的信息不足以回答您的问题(链接也超时了),请确保您遵循任何教程/手册并查看是否获得相同的结果。检查您正在更改的分支等等。 - stefanB
6个回答

7

我猜你正在寻找--no-ff开关在git merge中的用法。默认情况下,如果没有干扰提交,merge将只更新HEAD到新分支的末端。

如果你想保留合并提交以帮助对你的提交进行分组,请使用--no-ff


我开始使用这个,我永远不会离开它。 - Nanda Kishore

5
当我检查了git图表时,即使我按照相同的工作流程进行操作,所有的更改都发生在"master"上。没有树线分叉和汇合!
嗯......我确实看到了你的一些分支和合并。
你将在这个页面中找到所有可能的合并场景
(由现在的SO贡献者Jakub Narębski在2007年晚期编写)。
你可能处于快进情况下,这就解释了为什么你的合并会让你的所有提交在完成后都出现在主分支上:

2/ 快进情况; 没有A、B、C提交,我们从以下情况开始:

   1---2---3               <-- trunk    <-- HEAD
            \
             \-a---b---c   <-- branch

2.1/ "git merge branch",将分支合并。
   1---2---3            /----- trunk    <-- HEAD
            \          v
             \-a---b---c   <-- branch

快进结果只是简单地移动主干的头部。
它不会创建提交,因此:

2.2/ "git merge --no-commit branch"

与2.1中一样,因为快进不会创建提交。

因此,如果您在分支后没有在主分支上提交,并在主分支上执行合并,则只需重置主分支 HEAD...


另一个导致分支不显示的原因是在GitHub Network Graph visualizer演示页面上所述的“待办事项清单效应”(这就是你在这里所指的“git图形”)。

但是您仅能看到每个提交一次。 让它沉淀一秒钟。
我发现许多编码人员习惯于集中式SCM,以至于他们忽略了我们的Graph Visualizer实际上正在显示和连接不同的存储库。

如果我以自己为根绘制图形,则该图形显示了我尚未拉入我的repo的代码待办列表。
当我想了解社区在我的repo的fork中做了什么时,我可以查看图形并立即了解其他人的工作情况。
如果我要拉取Bertg的更改,则下次看到图形时,Bertg将不再显示,因为他将不再有任何我没有的提交。
保持思考待办列表,您将理解图形。

如果合并来自其他仓库分支的内容是如此(即一旦合并,您将不再看到这些分支),那么来自您自己的仓库分支的合并也可能是如此:一旦合并,您将不再在您的图表中看到它们。
但我会看到,因为:
  • 我不是项目所有者。
  • 我可能希望从您的任何分支拉取我的仓库更改。

哦!这让我想起了什么!但是如果你看我的项目图,我开始看到不同的分支,然后合并了一和二。但是后来,即使我对另一个分支做了同样的事情,我也没有看到任何类似的分歧(之前发生过的)。它似乎就像整个提交都在主分支上完成了。我想这就是重点。“git merge --no-commit”(我之前提到过)实际上就是这个问题的原因。不是吗? - Nanda Kishore
@Maddy:"git merge --no-commit" 并不是引起问题的原因,如果你处于快进合并的情况下,请参见我的编辑答案。 - VonC
git merge --no-commit:使用 --no-commit 参数执行合并操作,但是假装合并失败并且不自动提交,以便用户有机会在提交之前检查和进一步调整合并结果。因此,这意味着代码已经合并,但没有记录在 Git 中,所以您将看不到任何合并图形,对吗? - stefanB
@stefanB:没错。但如果是快进情况,只有主分支 HEAD 会被更新(无论是否提交)。然后,Maddy 进行一些修改并提交,再次在主分支上进行操作。在这种情况下(2.1 或 2.2),该分支将从图形中消失。 - VonC
谢谢Vonc!我真的误解了这个图表。正如所说,这个图表是关于代码而不是自我!当我的分支已经获取了那些提交(将其他分支中的更改拉取)时,我将不会看到相同的图表(或分支)。非常感谢! - Nanda Kishore

0

我自己也是全新的git和github用户(链接仍然无法访问),但是在查看了您的步骤后,可能是因为您没有将实际分支推送到github,这是可能的原因吗?目前对我来说似乎是有效的(我插入了push命令):

...
>> git commit -m "Authentication_feature is up" # commiting to the branch
>> git branch # just to confirm, which branch I am working on
>> git push origin authentication_feature # push the branch to github
>> git checkout master # trying to shift to master branch
...

@Chris,你把分支推到了远程地址,这是没问题的,但是没有合并到主分支!如果你现在检查一下网络图表链接(如果Github正在运行),你会发现我提到的方法确实创建了不同的开发线(图表线),只是之前而已。现在已经不行了:'(顺便说一句,我也是Git的新手。 - Nanda Kishore
关于合并到主分支的事项 - 我省略了其他步骤(“...”) - Chris J

0

您没有说明您实际使用了哪些命令,但我猜测您是使用了 git branch 命令创建了分支,但没有使用检出命令切换到该分支。您可以通过以下一步完成此操作:

git checkout master -b topic22

这样做可以减少您无意中提交到主分支的可能性。

现在您已经添加了您执行的命令序列,我看到您已经检出了分支。

命令序列看起来很好。我认为之所以看起来没有分支是因为主分支上没有介入的提交。合并后,它看起来像是一个连续的开发流程。这在其他答案中已经很好地讨论过了,所以这里不需要详细说明。


@Jamey,我已经更新了我的问题,并附上了我使用的命令。请指出问题所在。 - Nanda Kishore
我一直觉得topic22是一个有趣的功能。 - theIV

0

你是否在使用类似于

git show-branch

为了展示分支和检查点,一旦你将你的分支合并到主分支,你就无法再看到修订版本了 - 不确定为什么。

我找不到任何关于这种行为的解释,但是似乎 git 仓库没有任何问题,因为 git log 显示每个分支的所有提交。

所以我猜这只是工具显示分支图的方式。


@stefanB,我已经更新了我的问题,并附上了我使用的命令。请指出问题所在。 - Nanda Kishore
@stefanB,但是 Github 的网络图应该反映出我的提交和合并方式,不是吗?我确定我使用命令的方式有问题! - Nanda Kishore

0

作为使用git merge --no-ff的替代方案:

如果您想将主题分支开发的效果提交到主分支,但不是所有单独的提交,则可以使用git merge --squash。这样做时,提交不会标记为合并,并且没有第二个父级主题分支。单个提交的列表包含在压缩合并的提交注释中,就像它们在git log中列出的那样。

我们在与SVN(通过git svn)链接的项目中使用此功能,以便我们的主分支具有线性历史记录。这样,我们就不必在运行git svn dcommit之前扁平化git提交图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接