新 GIT 分支成为新基地,还是我遗漏了什么?

New GIT branch become new base or am I missing something?

我对 GIT 很陌生,所以我可能误解了我学到的一些东西。

我在 Visual Studio 2017 年使用 GIT 并将其同步到我在 VSTS 中的帐户。 我之前检查过一个分支 - 做了一些更改,这些更改已提交、合并并与 master 同步。

现在 - 当我尝试从 master 签出一个新的本地分支时 - 新分支显示在 master 分支的下方。然后我检出、提交、合并和同步的其他分支显示在主分支上方。

也许没关系?但是我找不到任何描述这种行为的地方。我看好像新的branc变成了新的基地?

我的问题是:为什么新分支显示在主分支下方,而以前显示在主分支上方? Visual studio branch view

答案在:

I assume the list is sorted alphabetically and doesn’t show anything about how the branches relate to each other.

然而,值得补充的是,这里还有一些重要的事情需要知道:Git 分支没有任何内在关系。 没有诸如parent 其他分支的分支。

令人困惑的是 commits do 有 parent/child 关系,从某种意义上说,分支是由提交。所以看起来分支机构也应该有它们。问题是,当我们在这里说 branches 时,我们指的是 branch names,比如 masterdevelop。这些名称只是 Git 提供的 user-changeable 个名称,供我们跟踪 一次提交 。每个分支名称记住的单个提交称为分支的 提示

A  <-B  <-C   <--master

每个实际提交都有一些丑陋的大哈希 ID 作为其真实名称,人类无法使用这些,因此我们使用名称 master 来记住提交的哈希 ID C.提交 C 记住其 parent B 的哈希 ID,并且 B 记住其 parent A 的哈希 ID。 (A 是这个小 three-commit 存储库中的第一次提交,所以它没有 parent 并且操作到此停止:因为它是第一次,所以历史结束了,在 Git的backwards-looking时尚。)

为了进行新的提交,Git 使用新的唯一哈希 ID 写出新提交——我们就称它为 D——然后更新 name master 存储 D 的哈希 ID。 D 本身包含 C 的哈希 ID,因此 Git 可以从 D:

中找到 C
A--B--C--D   <-- master

一旦提交,它就永远不会被改变(完全改变任何东西都会给你一个新的提交,一个新的唯一哈希 ID,所以旧的提交没有改变!)。我们知道内部箭头总是指向后方,所以没有必要绘制它们。但是,当我们创建一个新分支 name 时,我们最终得到两个指向同一个提交的名称:

A--B--C   <-- master, develop (HEAD)

现在我们需要将 HEAD 附加到分支名称,以便我们知道我们在哪个分支上!如果我们现在提交 D,移动的分支名称是 develop:

A--B--C   <-- master
       \
        D   <-- develop (HEAD)

但是我们可以随时使用git reset移动分支名称。例如,如果我们毕竟不喜欢 D,并且希望 developB 开始,我们可以 git reset 它并使事情看起来像这样:

A--B   <-- develop (HEAD)
    \
     C   <-- master
      \
       D  [abandoned, will go away in about a month]

如果我们现在进行新的提交 EE 的 parent 将是 B,可见部分将如下所示:

A--B--E   <-- develop (HEAD)
    \
     C   <-- master

(提交 D 无法找到它——用 Git 术语来说是 unreachable——所以我们无法通过正常方式看到它.)

结论

请记住,每个分支 name 只是一个指针,指向一 (1) 次提交,如上图所示。 Git 使用 提交 找到他们的 parent,沿着从 "where the name points" 的链向后通过历史。但是你会发现,当人们在 Git 中谈论 "a branch" 时,他们通常不是指 name,而是 the commits reached从名字开始向后移动。您必须从上下文中弄清楚某人的意思是 "the name"" 还是 "the set of commits"。有关此的更多信息,请参阅 What exactly do we mean by "branch"?