代码之家  ›  专栏  ›  技术社区  ›  Peter M

存储库中的分支是什么?

  •  3
  • Peter M  · 技术社区  · 15 年前

    根据我对Subversion的理解,如果您有一个包含多个项目的回购,那么您可以在该回购中对单个项目进行分支(请参见 SVN Red book - Using Branches )

    然而,我不太明白的是,当您在一个分布式系统(Git、Hg、Bazaar)中创建一个分支时会发生什么情况——我认为这与哪一个分支无关。您可以只对回购的一个子目录进行分支,还是在创建分支时对整个回购进行分支?

    这个问题是我在超级用户上发布的一个更大问题的一部分( choice and setup of version control )当我试图弄清楚如何最好地控制独立项目的大型层次布局时,出现了这种情况。

    可能对于分布式系统,我最想做的就是通过某种子项目机制来处理——但同样,这一点我还不清楚,尽管我听说过关于git的术语。

    4 回复  |  直到 13 年前
        1
  •  0
  •   Cascabel    15 年前

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

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

    o 有一个commit,它表示此时整个存储库的状态。因此,这两个分支通常代表整个回购的不同状态,尽管它们可能只在一个子目录的内容上有所不同。当然不会有任何浪费的空间;如果两个提交使用给定文件的同一版本,那么它们会在内部为其内容指向同一对象。

    根据你真正想做的事情,你可能对使用 submodules 它本质上是一种将repos放置在repos内部的机制,这样您就可以拥有一个包含子项目(嵌入)存储库的元项目存储库。

        2
  •  2
  •   sechastain    15 年前

    对于Bazaar,如果在共享存储库中创建两个分支,那么它们拥有的任何公共历史都存在于存储库中,而不是分支本身——分支只引用它。这样可以为具有相同项目的多个分支、具有不同功能的存储库节省磁盘空间,并加快创建新分支的速度(不必复制包含分支历史的文件)。我看过hg和git已经有一段时间了,但我不相信它们有和这个相同的特性。

    巴扎没有子项目。分支是一个完整的、连续的单元。你不能将它的一部分分支。不过,我相信Git和Hg都有分支机构。

        3
  •  1
  •   Community CDub    8 年前

    颠覆是集中的,你可以在 按你的意愿回购。 因为branchbes被模拟为带有svn的目录,所以最终会混合:

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

    但是用 DVCS ,每个存储库都是它自己的组件(或模块)。
    也就是说,你不想 全部的 你的项目在一个回购中。
    而是你在使用 submodules (Git) or subrepos (Hg) .

    这就让你将分支视为纯粹的历史隔离:
    当你的分支,历史的 全部的 repo创建一个新的分支,准备记录(引用)您将要进行的任何新提交。
    这不是“便宜的复制品”,只是一个新的指针。
    注:Mercurial有一个 more complex branching model 这可能需要克隆一个repo来创建一个新的分支,但是分支背后的一般原则是成立的。

        4
  •  0
  •   Andrew Aylett    15 年前

    一般来说,分布式版本控制系统只支持您从现有分支的整个分支中创建一个新分支,而不允许您复制正在工作的一小部分内容(就像Subversion那样)。Git至少(我认为还有其他一些)允许您引用子模块(它们本身就是Git存储库)。

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

    在这方面,Mercurial与Git至少有所不同,因为Mercurial工作流似乎是为尝试在不同的存储库中保留不同的分支而量身定做的,而Git工作流则非常乐意在同一存储库中拥有多个分支。

    推荐文章