Git:无法理解为什么分支(主题)提交/合并正在主分支上发生

时间:2010-02-04 02:35:52

标签: git github merge branch commit

注意:我不确定是否已经提出过这个问题,因为我找不到符合我的背景的任何问题(或者我无法理解现有问题'背景')

这些天我很喜欢Git。特别是,主题分支。我正在开发一个小代码共享应用程序。我有(本地)分支,如“主”,“认证”,“书签”,“评论”,“鼻子”等......

我的(预期)工作流程如下:创建主题分支==>关于主题分支的工作==>将文件提交到分支==>将主题分支更改合并到“主”分支。 (后来删除主题分支)

我尝试过为几个分支做同样的事情。它工作正常。但后来当我检查git图时,即使我遵循相同的工作流程,所有机会都发生在“主人”上。没有树线分叉和会聚!它显示了一条带有多个提交的单线。我不知道为什么?我的印象是,我用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)

6 个答案:

答案 0 :(得分:7)

我打赌你正在--no-ff上寻找git merge开关。默认情况下,如果没有介入提交,merge只会将HEAD更新为新分支的提示。

如果您希望保留合并提交以帮助对提交进行分组,请传递--no-ff

答案 1 :(得分:5)

  

但后来当我检查git图时,即使我遵循相同的工作流程,所有机会都发生在“主人”上。没有树线分叉和会聚!

嗯......我确实看到了你的一些分支和合并。

您将在此page all the possible merge scenarios中找到 (当时编译 - 2007年底 - 现在是SO撰稿人:Jakub Narębski

你可能处于一个快进的案例中,这可以解释为什么你的合并将使你的所有提交在完成后看起来是主要的:

  

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一样,因为快速转发不会创建提交。

因此,如果你没有提交master,因为你扩展了,然后在master上进行合并,你所做的只是重置主HEAD ......


分支未显示的另一个原因是presentation page of the GitHub Network Graph visualizer上描述的“待办事项列表效果”(这是您在此引用的“git图”)

  

但是你只看到每次提交一次。让它沉入一秒钟   我发现很多编码人员习惯于集中式SCM,他们错过了我们的Graph Visualizer实际显示和连接不同的存储库这一事实。

     

如果我以root身份绘制图形,那么图表会显示一些我尚未进入我的仓库的待办事项列表。
  当我想要了解社区在我们的回购分支中所做的事情时,我可以立即查看图表,并立即看到其他人在做什么。
  如果我要接受Bertg的更改,下次看到图表时,Bertg将不再显示,因为他将不再有任何我不提交的提交。
  继续思考待办事项列表,你就会明白图表。

因此,如果对来自其他repos分支的合并确实如此(即,一旦合并它们就不再看到这些分支),对于来自您自己的 repo分支的合并可能就是这样:一旦合并,你在图表中看不到它们了。

但我确实如此:

  • 我不是该项目的所有者。
  • 我可能想从您的任何分支机构中提取我的回购更改。

答案 2 :(得分:0)

您没有说出您实际使用的命令,但我的猜测是您使用git branch创建了分支,但没有检查它以移动到分支。您可以按如下步骤执行此操作:

git checkout master -b topic22

这使你不太可能无意中承诺掌握。

现在你已经添加了你所做的命令序列,我看到你确实检查了分支。

命令序列看起来很好。我认为它看起来没有分支的原因是因为主分支上没有干预提交。合并后,它看起来像一个顺序开发流程。在其他一个答案中对此进行了详细讨论,因此无需在此详述。

答案 3 :(得分:0)

您使用的是

git show-branch

向您展示分支机构和签到,一旦您将分支机构合并到主分支机构,您就看不到任何修订版本 - 不确定原因。

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

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

答案 4 :(得分: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
...

答案 5 :(得分:0)

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

如果要将主题分支开发的效果提交到主分支,而不是所有单个提交,则可以使用git merge --squash。执行此操作时,提交未标记为合并,并且没有主题分支的第二个父级。单个提交的列表包含在压缩合并的提交注释中,因为它们将由git log列出。

我们一直在链接到SVN(git svn)的项目中使用它,因此我们的主分支具有线性历史记录。这样,我们就不必在运行git svn dcommit之前展平git提交图。