混淆在git中创建嵌套分支

时间:2015-03-01 05:45:10

标签: git nested branch

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

我的存储库位于本地计算机中。我用git init --bare创建了存储库。我添加了初始代码来掌握并推送它。然后我使用git branch develop; git push -u origin develop添加了“develop”分支。

现在我想从“develop”创建功能分支,我希望所有协作者都可以访问这些功能分支。我希望有一个嵌套的结构,像这样

origin/master
origin/develop
origin/develop/newFeature
origin/develop/anotherFeature
etc.

这样当协作者输入git branch -a时,他/她会立即知道“newFeature”在“开发”行中,并决定该怎么做。

经过一些试验和错误,这就是我所做的:

git clone file:///path/to/repo --branch develop
git checkout -b newFeature develop
EDIT some files
git add .
git commit
git push origin newFeature

现在这个“newFeature”可供所有协作者克隆。 git branch -a给了我

  develop
* newFeature
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
  remotes/origin/newFeature

“newFeature”真的是“开发”分支的一部分吗?或者它现在是分支?一旦我克隆了“newFeature”,我该如何检查它是否是开发线?这可能会让人感到困惑,因为我可能会在适当的时候在master中找到一个名为“newFeature”的分支!

我对git如何工作的理解肯定是不合适的。因此,如果有人能指出我正确的方向,那就太棒了!

TIA,

1 个答案:

答案 0 :(得分:20)

TL; DR版本:最初只是git checkout -b develop/feature(您需要有一个名为develop的分支才能实现此功能!)。


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

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

使(本地)分支名称特殊的东西 - 使它们与任何其他引用不同的是 - “git checkout”将通过在git的{{1中写出分支的名称“来让你”在分支上“一旦你完成了这个,提交一个新的提交将自动更新分支名称,以便它指向你刚刚提交的新提交。<}文件, / p>

(远程分支名称不能以这种方式“开启”,但也会根据需要更改目标SHA-1。我之所以提到这一点,只是因为下一段提到“远程分支”或“远程跟踪分支” ,您将在HEAD输出中看到。)

但是,分支名称按git branch -r排序(按“种类”排序后,即首先将所有本地分支分组在一起,然后是所有远程分支)。这意味着可以将名称组合在一起:只需将名称创建为git branch --listdevelop/anotherFeature。在这种情况下,斜杠只是名称的一部分。

这里的问题是git最初通过将它们放在包含文件的目录中来实现 1 这些分支名称。在支持git的系统上,您不能同时拥有名为develop/newFeature 的文件名为develop的文件。 2 所以如果你有一个名为develop的分支,git可能已经创建了一个文件(develop,特别是),然后阻止它创建一个包含该文件的目录(.git/refs/heads/develop)({ {1}})包含分支当前标识的提交的SHA-1。


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

2 我个人认为文件系统名称实体同时作为目录文件工作是有意义的:这将是一种方法,例如,存储所有可执行文件的ELF部分作为可执行程序目录中的文件,或处理MacOS为应用程序包执行的操作。但这违反了POSIX必须工作方式的各种规则,因此需要重新设计文件系统名称空间,并且更适合作为Plan 9的后续工作(例如)而不是Unix-ish变体。