【问题标题】:Git: Unable to understand why branch (topic) commits/merges are happening on the master branchGit:无法理解为什么在主分支上发生分支(主题)提交/合并
【发布时间】:2010-02-04 02:35:51
【问题描述】:

注意:我不确定这是否已经被问过,因为我找不到任何适合我的上下文的问题(或者我无法理解现有问题的上下文')

这些天我爱上了 Git。特别是主题分支。我正在开发一个小型代码共享应用程序。我有(本地)分支,如“master”、“authentication”、“bookmarks”、“cmets”、“nose”等......

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

我尝试为几个分支做同样的事情。它工作得很好。但后来当我检查 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)

【问题讨论】:

  • 您的链接对我不起作用。你是如何创建分支的?我认为我们需要更多信息,例如您使用的命令。
  • 恐怕没有足够的详细信息来回答(链接也会超时),请确保您遵循任何教程/手册并查看是否获得相同的结果。检查您进行更改的分支等等。

标签: git github merge branch commit


【解决方案1】:

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

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

【讨论】:

  • 我开始使用这个,我永远不会离开那个。
【解决方案2】:

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

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

你会发现在这个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 上进行合并,您所做的就是重置 master HEAD...


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

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

如果我以自己为根来绘制图表,那么图表会显示我尚未拉入我的存储库的待办事项代码列表。
当我想了解社区在我的 repo 的分支中所做的事情时,我可以打开图表并立即查看其他人在做什么。
如果我要引入 Bertg 的更改,下次我看到图表时,Bertg 将不再显示,因为他将不再有我没有的任何提交。
继续思考待办事项列表,您就会理解图表。

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

但我愿意,因为:

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

【讨论】:

  • 哦!这让我思考!但是,如果您看到我的项目图,我会在开始时看到不同的分支并合并一和二。但后来即使我对另一个分支做了同样的事情,我也没有看到那个分支有任何类似的转移(以前发生过)。看起来好像整个提交都是在主服务器上完成的。我认为这就是重点。 “git merge --no-commit”(我之前提到过)实际上是造成这个问题的原因。不是吗?
  • @Maddy: "git merge --no-commit" 不是这里的原因,如果您处于快进合并场景中。请参阅我编辑的答案。
  • git merge --no-commit :使用--no-commit 执行合并,但假装合并失败并且不自动提交,以便用户在提交之前有机会检查并进一步调整合并结果。 - 所以这意味着代码已经合并,但它不是 git 中的记录器,所以你不会在图中看到任何合并,对吗?
  • @stefanB:正确。但是如果是快进的情况,无论如何只有主 HEAD 被更新(提交与否)。然后,Maddy 做一些修改并提交,再次在 master 上。在那种情况下(2.1 或 2.2),分支将从图中消失。
  • 谢谢冯克!我真的误解了图表。正如它所说,图表是关于代码而不是自我!当我的分支已经获得这些提交时(拉动其他分支中的更改!),我不会看到相同的图表(或分支)。非常感谢
【解决方案3】:

你在使用类似的东西

git show-branch

为了向您展示分支和签入,一旦您将分支合并到 master 后,您将无法再看到修订 - 不知道为什么。

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

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

【讨论】:

  • @stefanB,我用我使用的命令更新了我的问题。请告知问题出在哪里。
  • @stefanB,但 github 网络图应该反映我如何提交和合并不?我确定我使用命令的方式有问题!
【解决方案4】:

我自己是 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 新手。
  • re: 合并到master - 我删掉了其他步骤(“...”)
【解决方案5】:

您没有说您实际使用了哪些命令,但我猜您使用git branch 创建了您的分支,但没有将其签出以移至该分支。您可以按如下方式一步完成:

git checkout master -b topic22

这降低了您无意中提交给 master 的可能性。

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

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

【讨论】:

  • @Jamey,我用我使用的命令更新了我的问题。请告知问题出在哪里。
  • 我一直觉得 topic22 是一个有趣的功能。
【解决方案6】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2020-11-14
    • 2014-11-13
    • 2019-07-29
    • 2011-02-01
    • 2017-08-14
    相关资源
    最近更新 更多