Git存储库的结构


15

很抱歉,如果这是重复的,我看了看。

我们要搬到Git。在Subversion中,我习惯于使用\ trunk,\ branches和\ tags文件夹。

使用Git,在分支之间切换将替换工作目录的内容,因此我是否可以假设我们以前的工作方式不适用于Git?

我的猜测是,我将拥有一个可能带有gitignore和readme.txt的repo文件夹,然后是组成该repo的项目的文件夹,仅此而已。

Answers:


15

您将拥有“ trunk”(现在称为“ master”),“ branches”(现在称为“ heads”)和“ tags”(仍称为“ tags”),但它们不会是文件夹,而将是“ refs”,即位于存储库中单独命名空间中的修订的标签。

Subversion和Git有不同的分支方式。基本的Subversion模型是具有一个具有单个全局时间轴的目录树,如果要分支,则可以在另一个目录中复制一个子树。

另一方面,Git的目录树带有修订版本,每个修订版本都定义了其父级,但是每个修订版本可以具有多个父级(合并)和多个子级(分支)。因此,您不必拥有分支的目录,而可以独立创建修订。“参考”仅是与给定“分支”的最新修订版关联的名称。

这种差异是分布式版本控制的基础。Git(和其他分布式系统)没有任何保持历史线性的中央权限,因此可以在多个存储库之间独立创建修订版本,而无需彼此了解,并且系统必须容纳这些修订版本。事实证明,泛化通常使分支和合并变得容易得多。

请注意,在Git中,修订版不在任何分支上。它们就是,分支包含它们。但是,一旦分支合并,或者证明分支已经死了,您可以删除指向它的“ ref”,然后完全忽略它(如果您丢弃旧的试验,最终将使用对其进行垃圾收集git gc)。这可以帮助您避免陷入老旧实验而没人记住的事实。


凉。不需要标签,分支和其他文件夹废话。可爱。
路加·普普利特

2
@LukePuplett:Subversion的分支方法非常独特。它来自Perforce,我相信这是唯一拥有它的版本控制系统。颠覆并没有清楚地区分什么是分支这一事实使合并算法变得非常复杂。它提供了一定的灵活性,但是3向合并实际上并不能支持这种灵活性,从而导致很多难以理解的极端情况。
Jan Hudec 2012年

甚至CVS(这是SVN的精神前身)也没有使用(相当奇怪的)分支和标签实际上是目录的方法。我并不是说CVS的分支做得很好,但是至少它们在一个“适当的”概念而不是仅在目录中存在。
Joachim Sauer

@JoachimSauer:我不确定CVS是Subversion的精神先驱。他们的任务是制造“更好的CVS”,但是他们主要借鉴了Perforce的概念。
Jan Hudec

@JanHudec:很有可能,我对Perforce不太了解。我的意思恰恰是那个使命:成为CVS的良好接班人。
Joachim Sauer

3

只需将Git视为在SVN中以2D方式看到的相同数据的3D视图-即使用SVN分支您的根,它作为副本显示为树中的新文件夹。使用Git,当您分支时,它会以副本的形式显示在现有树的顶部。一旦意识到,将差异概念化就很容易了。

使用SVN,您仍然可以像Git一样工作-在分支之间切换将用分支视图替换代码库的单个视图,无论您使用svn switch还是git checkout都适用。

显然,您可以通过将分支检出到其文件夹位置来获得SVN中的分支副本,这与将git repo复制到磁盘上的其他位置相同。

标签同样适用-您可以标记git版本,也可以为发布创建分支。SVN标签与分支相同,唯一的约定是它们被称为“标签”。您可以标记(以及记录修订号)SVN存储库,以获取版本的快照。

git和svn之间的差异更多与签入和签出的方式有关,而不与源代码管理的基础有关。代码的视图可以不同(您永远不会看到在git中包含分支的代码树的单个视图,并且可以在SVN中分支部分存储库,但这最终是微小的差异)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.