我刚开始使用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,
答案 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 --list
和develop/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变体。