什么是存储库中的分支?

时间:2010-05-27 13:03:17

标签: svn git bazaar mercurial

根据我对subversion的理解,如果你有一个包含多个项目的repo,那么你可以在该repo中分支单个项目(参见SVN Red book - Using Branches

然而,我并不完全遵循的是当您在其中一个分布式系统中创建分支时会发生什么(Git,Hg,Bazaar - 我觉得哪个不重要)。你可以只分支回购的子目录,或者当你创建分支时,你是否分支整个回购?

这个问题是我在超级用户(choice and setup of version control)上发布的更大问题的一部分,并且在我试图弄清楚如何以最佳版本控制独立项目的大型分层布局时出现。

对于分布式系统而言,我想要做的事情最好由某种子项目机制来处理 - 但这也是我不清楚的事情,尽管我已经听过关于GIT中。

4 个答案:

答案 0 :(得分:2)

使用bazaar,如果在共享存储库中创建两个分支,则它们存在于存储库中的任何常见历史记录而不是分支本身 - 分支仅引用它。这为存储库保存了磁盘空间,这些存储库具有用于不同功能的相同项目的许多分支,并且加速了新分支的创建(您不必复制包含分支历史记录的文件)。我看了hg和git已经有一段时间了,但我不相信他们有与此相同的功能。

Bazaar没有子项目。分支是一个完整的,连续的单元。你不能分支它的一部分。我相信git和hg都有分支。

答案 1 :(得分:1)

Subversion是集中式的,您可以根据需要在一个仓库中组织项目。 由于branchbe被模拟为SVN目录,因此最终混合:

  • 历史记录隔离( main purpose of a branch :您从相同文件集中隔离其他版本的一组文件的版本)
  • “组件”隔离(组件或模块是各自位于其自己目录中的文件组)

但是使用 DVCS ,每个存储库都是自己的组件(或模块)。
即您不希望将所有项目放在一个仓库中 而是使用submodules (Git) or subrepos (Hg)

这使你的分支成为纯粹的历史隔离:
分支时, all repo的历史记录会创建一个新的分支,准备记录(引用)您将要进行的任何新提交。
这不是“便宜的副本”,只是一个新的指针 注意:Mercurial有一个more complex branching model,可能涉及克隆一个repo来创建一个新的分支,但是分支的一般原则就是。

答案 2 :(得分:0)

通常,分布式版本控制系统只支持您在整个现有分支中创建一个新分支,而不是(如Subversion所做的那样)允许您复制一小部分内容。继续努力。 Git至少(我认为其他一些)允许你引用子模块(它们本身就是git存储库)。

Git确实允许你做任何你想做的事情,即使它没有特别有用或明显(即使这些工具不能真正支持你这样做)。没有技术上的理由为什么Git存储库中的所有分支都需要有一个共同的父级或者根本没有任何关系。也没有什么可以阻止你构建一个包含其父提交的子树的提交,而Git的更改跟踪和合并实际上可能在这种情况下很好地应对。

Mercurial在这方面至少与Git不同,因为Mercurial工作流程似乎适合于在单独的存储库中保留单独的分支,而git工作流非常满意在同一存储库中有许多分支。

答案 3 :(得分:0)

使用git,分支只是指向分支顶端提交的指针。它不包含任何自己的信息。所以,你的历史可能是这样的:

- o - o - o - o - o (branchA)
           \
            o - o (branchB)

每个o都有一个提交,它表示此时整个存储库的状态。因此,这两个分支通常代表整个仓库的不同状态,尽管它们可能只是在一个子目录的内容上不同。但是,肯定不会浪费任何空间;如果两个提交使用相同版本的给定文件,则它们在内部指向同一个对象以获取其内容。

根据您实际尝试做的事情,您可能会对使用submodules感兴趣,{{3}}本质上是一种将repos置于repos中的机制,这样您就可以拥有一个包含元素项目的存储库子项目(嵌入式)存储库。

相关问题