Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn 存储库中的分支是什么?_Svn_Git_Bazaar_Mercurial - Fatal编程技术网

Svn 存储库中的分支是什么?

Svn 存储库中的分支是什么?,svn,git,bazaar,mercurial,Svn,Git,Bazaar,Mercurial,根据我对subversion的理解,如果您有一个包含多个项目的repo,那么您可以在该repo中分支单个项目(请参阅) 然而,我不太明白的是,当您在一个分布式系统(Git、Hg、Bazaar)中创建一个分支时会发生什么情况——我认为哪一个并不重要。您可以只分支回购协议的一个子目录,或者在创建分支时是否分支整个回购协议 这个问题是我在superuser()上发布的一个更大问题的一部分,它是在我试图找出如何最好地控制独立项目的大型层次结构布局时出现的 对于分布式系统,我想做的可能是最好通过某种子项目

根据我对subversion的理解,如果您有一个包含多个项目的repo,那么您可以在该repo中分支单个项目(请参阅)

然而,我不太明白的是,当您在一个分布式系统(Git、Hg、Bazaar)中创建一个分支时会发生什么情况——我认为哪一个并不重要。您可以只分支回购协议的一个子目录,或者在创建分支时是否分支整个回购协议

这个问题是我在superuser()上发布的一个更大问题的一部分,它是在我试图找出如何最好地控制独立项目的大型层次结构布局时出现的


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

对于bazaar,如果在共享存储库中创建两个分支,他们拥有的任何公共历史都存在于存储库中,而不是分支本身——分支只是引用它。这为具有相同项目的多个分支的存储库节省了磁盘空间,并加快了新分支的创建(您不必复制包含分支历史的文件)。我已经有一段时间没有研究hg和git了,但我不相信它们有与此相同的特性


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

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

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


Mercurial至少在这一点上与Git不同,因为Mercurial工作流似乎是为尝试在单独的存储库中保留单独的分支而定制的,而Git工作流非常乐意在同一存储库中有许多分支。

对于Git,分支只是分支顶端提交的指针。它本身不包含任何信息。因此,您的历史可能如下所示:

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


根据您实际要做的事情,您可能会对使用它感兴趣,它本质上是一种将repo放置在repo内部的机制,这样您就可以拥有一个包含子项目(嵌入式)存储库的元项目存储库。

Subversion集中化后,您可以根据需要在一个repo中组织您的项目。 由于branchbes被模拟为带有SVN的目录,因此最终会混合使用:

  • 历史隔离(即:将一组文件的版本与同一组文件的其他版本隔离)
  • “组件”隔离(组件或模块是各自目录中的一组文件)
但对于,每个存储库都是自己的组件(或模块)。
也就是说,您不想将所有项目放在一个回购协议中。
相反,你正在使用

这使您将分支作为纯历史隔离:
当您进行分支时,所有回购的历史记录将创建一个新分支,准备记录(参考)您将做出的任何新承诺。
这不是“廉价复制品”,只是制作了一个新指针。

注意:Mercurial有一个新的分支,可能涉及克隆回购协议以创建新分支,但分支背后的一般原则是正确的。

您所描述的与hg或git的区别到底是什么?我不确定您指的是在同一存储库中还是在不同的存储库中有两个分支。对于同一个存储库,Git将只保存每个对象的一个副本——当您创建一个新分支时,它永远不会复制数据。对于多个存储库,默认情况下是复制所有内容,但也可以让新存储库为其对象引用旧存储库。我相信汞也是如此。此外,git不支持此处所述的分支机构;不过,您可以使用子模块(它们本身是独立的git存储库)。@Andrew这就是我的git知识受到怀疑的地方,因为我不是一个狂热的用户。但据我所知,在git中包含分支的目录实际上可以包含许多分支,其中只有一个是活动的(即反映在该目录树的文件内容中)。通过这种方式,是的,目录中分支的修订历史记录在git中共享。在bazaar中,包含分支的目录只包含一个分支。如果该分支目录位于存储库目录中,则共享同一repo目录中其他分支之间的历史记录。分支是git中存储库的属性,而不是目录。在cont中听到短语“包含分支的目录”是很奇怪的