对在git中创建嵌套分支感到困惑吗

对在git中创建嵌套分支感到困惑吗,git,nested,branch,Git,Nested,Branch,我刚开始使用git,并开始与其他开发人员在同一代码上合作。我以前曾与SVN合作过一点,但从未在我的代码库上与其他人合作过。 现在,由于协作者使用相同的代码,我需要一个高效的工作流。在搜索这些时,我发现,对于我们的需求来说,这似乎是一个很好的工作流程 我的存储库位于本地计算机中。我使用gitinit--bare创建了存储库。我将初始代码添加到master并按下。然后我使用git-branch-develope添加了一个“develope”分支;git push-u origin develope

我刚开始使用git,并开始与其他开发人员在同一代码上合作。我以前曾与SVN合作过一点,但从未在我的代码库上与其他人合作过。 现在,由于协作者使用相同的代码,我需要一个高效的工作流。在搜索这些时,我发现,对于我们的需求来说,这似乎是一个很好的工作流程

我的存储库位于本地计算机中。我使用
gitinit--bare
创建了存储库。我将初始代码添加到master并按下。然后我使用
git-branch-develope添加了一个“develope”分支;git push-u origin develope

现在,我想从“开发”创建功能分支,我希望所有协作者都能访问这些功能分支。我希望有一个嵌套结构,类似这样的东西

origin/master
origin/develop
origin/develop/newFeature
origin/develop/anotherFeature
etc.
因此,当协作者在git branch-a中键入时,他/她将立即知道“新特性”在“开发”行中,并决定要做什么

经过反复试验,我做到了:

git clone file:///path/to/repo --branch develop
git checkout -b newFeature develop
EDIT some files
git add .
git commit
git push origin newFeature
现在,所有合作者都可以克隆此“新功能”
git分支-a
给我

  develop
* newFeature
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
  remotes/origin/newFeature
那么,“新功能”真的是“开发”分支的一部分吗?或者现在它是独立的分支?一旦我克隆了“新功能”,我如何检查它是否是开发线?这可能会让人困惑,因为我可能会在适当的时候在master中拥有一个名为“newFeature”的分支

我对git如何工作的理解显然是不够的。所以,如果有人能给我指出正确的方向,那就太好了


TIA,TL;DR版本:刚开始时只需
git checkout-b develop/feature
(您不需要名为
develope
的分支就可以工作!)


分支并不真正“嵌套”,原因非常简单:分支名称(如
newFeature
)仅代表某个提交ID,即某个提交的某个SHA-1“真实名称”

(在这方面,分支名称与标记相同,如“v2.3”。)

使(本地)分支名称与众不同的是,“git checkout”将允许您通过将分支名称写入git的
HEAD
文件来获取“分支上的”,并且,一旦您这样做,进行新的提交将自动更新分支名称,以便它指向您刚刚进行的新提交

(远程分支名称不能通过这种方式获得,但也会根据需要更改其目标SHA-1。我之所以提到这一点,是因为下一段提到了“远程分支”或“远程跟踪分支”,您将在
git branch-r
output中看到这一点。)

然而,分支名称是按
git Branch--list
排序的(按“种类”排序后,即先将所有本地分支分组在一起,然后再将所有远程分支分组)。这意味着您可以将名称分组在一起:只需将名称最初创建为
develope/anotherFeature
develope/newFeature
。在本例中,斜杠只是名称的一部分

这里的问题是git最初是通过将这些分支名称放在包含文件的目录中来实现的。在支持git的系统上,不能同时有一个名为
develop
的目录和一个名为
develop
的文件。2因此,如果有一个名为
develop
的分支,git可能创建了一个文件(
.git/refs/heads/develop
),这会阻止它创建目录(
.git/refs/heads/develop
,再次)包含文件(
newFeature
),其中包含分支当前标识的提交的SHA-1


1虽然git现在也使用平面文件(
.git/packed refs
)来存储分支到SHA-1的映射,但它仍然使用文件目录,并且必须确保您不创建必须同时用作目录和文件的名称


2就个人而言,我认为文件系统名称实体同时作为目录和文件工作是有意义的:例如,这将是一种将可执行文件的所有ELF部分作为文件存储在可执行程序目录中的方法,或者处理MacOS为应用程序包所做的事情。但这违反了way必须在POSIX中运行,因此需要对文件系统名称空间进行重大重新设计,并且作为Plan 9的后续版本(例如)比作为Unix ish变体更合适。

感谢您的澄清,torek。