我在GIT客户端看GIT分支机构错了吗?

时间:2017-01-04 14:29:56

标签: git user-interface branch

当我使用GIT分支时,我任何给定分支的“心理模型”是它是从我以该分支为基础的分支突破的路径。我们假设我做了以下事情:

git checkout develop
git checkout -b feature/1
touch README.md
git add --all
git commit -m "Added README.md"
git push -u origin feature/1
git checkout develop
git merge feature/1
git push

现在,我希望通过将develop分支绘制为单独的路径来使git GUI可视化。然后,从develop分支路径,我希望看到feature/1分支路径从develop分支路径中突破。然后我希望看到两条路径相互并排,直到我将feature/1合并到develop中。此时我希望看到feature/1分支路径合并回develop分支路径。

enter image description here

但是,当我在任何给定时间只在一个分支上工作时(除了始终存在的开发和主分支) - 这不是发生的事情。如果我开始研究一个新的分支,完成分支并将其合并回开发,这一切似乎都发生在同一个“路径”上。然而,当我同时在两个分支上工作时,似乎其中一个分支在其自己的路径上突然出现。但是,第一个分支只是可视化为开发分支的延续。

enter image description here

我发现令人困惑的是,只有一个分支在视觉上用自己的路径表示,而另一个分支只是表示为开发分支的直接延续。我错了 - 或者考虑分支错了?我只是希望得到一个清晰而一致的视图,当我将一个新的分支从开发中分解出来并且当我再次合并它时。在我看来,为每个创建的分支创建一个单独的路径会使这更容易获得。

enter image description here

那里有GIT客户端吗?或者我需要以不同的方式看待它?

3 个答案:

答案 0 :(得分:3)

你的问题"是的,你不知道快进合并。如果没有任何要合并的东西,意味着你没有在分支和合并之间进行任何改变,那么你默认进行快进合并只会使develop指向同一个提交为feature/1。如果您希望保留具有不同路径的历史记录,则可以使用--no-ff merge选项来创建合并提交,即使实际上没有任何合并也是如此。然后任何Git客户端都会显示您期望的图像。如果你不这样做,没有Git客户端可以向你显示,因为这不是历史记录的样子。

答案 1 :(得分:2)

您在此处看到的是fast-forward mergestrue merges之间的区别。

在Git中,将一个分支合并到另一个分支中并不会导致merge commit;如果自分支点以来在目标分支上没有进行新的提交,Git将只是向前移动源分支,使其指向与目标分支相同的提交。

考虑这个例子:

A - B - C (master)
     \        
      E - F (feature)

这里,feature分支的分支点是提交B。从那时起,在C分支上提交了master。如果您要将feature合并到master,Git会注意到分支点不再是master中的最新提交,因此它必须 tie 通过创建合并提交,这两个历史记录在一起(您称之为" 路径"),这是一个具有多个父级的提交:

A - B - C - M (master)
     \     /   
      E - F (feature)

但是,如果自分支点以来master上没有发生新的提交,Git只会将master分支向前移动到指向与feature相同的提交。这称为fast-forward merge

  

<强>快进
  快进是一种特殊类型的合并,您可以在其中进行修订,然后合并&#34;合并&#34;另一个分支改变了这一点   碰巧是你拥有的后代。在这种情况下,你没有   进行新的合并提交,但只是更新到他的修订版。

所以,鉴于这种情况:

A - B (master)
     \        
      E - F (feature)

feature合并到master只会导致:

A - B - E - F (master, feature)

如果您想强制Git创建合并提交,即使它会执行快进合并,您也可以添加--no-ff git-merge选项。所以这样做:

git merge feature --no-ff

会导致:

A - B - M (master)
     \   \   
      E - F (feature)

答案 2 :(得分:1)

注意:Git 2.33(2021 年第三季度)澄清了术语表中“fast-forward”的描述:

请参阅 commit e22f2daReuven Y (robi-y)(2021 年 5 月 19 日)。
(2021 年 6 月 10 日于 Junio C Hamano -- gitster --commit 7f06d94 合并)

<块引用>

docs:改进词汇表内容的快进

签字人:Reuven Yagel

<块引用>

文本在修订本身和作者之间有些混乱。

glossary-content 现在包含在其 man page 中:

<块引用> <块引用>

快进:

快进是一种特殊类型的合并,您有一个修订版,并且您正在“合并”另一个分支的更改,这些更改恰好是您所拥有内容的后代。

在这种情况下,您不需要进行新的合并提交,而只是更新您的分支以指向与您要合并的分支相同的修订版