由于Git能够跟踪(并保持干净)具有完全不同内容的分支,在同一个存储库中,一些项目(如Git本身)已经开始使用它。
例如,Git使用一个分支代码本身,同时将其文档保存在单独的分支中。同样的回购,只是不同的分支。可能只是我,来自SVN背景,但我发现在这些分支中“没有任何共同点”令人困惑。开发/分期/生产分支机构;那些我理解的。分支不完整的特征;当然,我也在做那些。哎呀,每个语言都有一个分支的文档。但没有共同的文件?
这只是(可能是一个未被充分利用和/或未被低估的)Git中的功能,每个人都应该拥抱和习惯,或者一个懒惰的人可能会因为没有区分同一个项目的两个方面而被滥用?
答案 0 :(得分:16)
我个人不会在不同的分支中存储不同的内容;在文档和代码的情况下,我只需创建一个myproject.git和一个myproject-docs.git(如果构建过程需要,则将文档子模块化为代码)。
另一方面,如果你这样做会发生什么不好的事情。 Git不会告诉你该怎么做,所以你可以自由决定如何使用它。所以要回答你的问题,它既不是一个杀手级的功能,也不会让你感到沮丧,如果你不小心的话。这就是有人选择使用它的方式。
答案 1 :(得分:11)
Git跟踪项目中(文本)文件的协调更改,因此它不知道或不关心分支是否可以合并。在Git仓库中拥有独立分支类似于在Subversion仓库中拥有独立项目,这是一种常见的做法(因为svn的开销)。
因为Git的数据结构与SVN非常不同,所以你可以用它们做不同的事情。在SVN中,功能分支有点不寻常,并且通常不会合并到主干的功能分支可能是“难闻的气味”,这表示程序员“变暗”并且正在创建可能永远不会成为的代码整合到项目中。在Git中,功能分支是一个非常安全且合理的工作流程。
所以它们可以以不同的方式使用,因为 Git不是SVN ,即使它们都有存储库,分支和提交,并且提供源控制的相同的一般功能。
随着我对Git的更多体验,怪异的内容变成了不同。然后我很好奇我能用不同的工具做些什么。
答案 2 :(得分:9)
我认为这更像是一个懒惰的解决方法,因为Git目前无法处理多个项目存储在同一个存储库中。你可以做到,但是没有办法拉下你想要的那个。
我说“懒惰”,因为当git开发人员发现需要它(用于存储文档)时添加该功能并不会太难以实现。由于他们使用了这个奇怪的分支黑客,他们为其他人解决问题的动机已经大大减少了。
答案 3 :(得分:3)
这样做的好处是,如果你感兴趣的话就可以只提取文档分支。就像jrockway所说的那样,你可以使用另一个存储库和子模块来做到这一点,如果有必要,但是有这种能力来创建一个'裸'分支,你可以不选择。
就个人而言,我仍然对此持怀疑态度。我明白为什么它可能是有益的,但我并不完全相信这是最好的方式。
答案 4 :(得分:3)
我认为这取决于你的项目是什么。
Git显然是一个社区OSS项目,所以在(相同的)存储库中拥有文档,这样每个人都可以获得它们(对我而言)。
另一方面,我不会将我的项目的文档存储在工作中,因为我会rarley编辑它们,除了“让我们更新文档”类型的票证。在工作中我不希望我的文档与我的源混合,我只想要源(我知道的典型程序员视图)。
其他人可能希望他们在一起。我认为你只需要意识到它意味着什么(记住每个人都有一个完整的存储库副本)并为你的项目选择最佳选择。
答案 5 :(得分:2)
当你习惯于向用户展示树的Subversion模型时,这有点奇怪,但是一旦你习惯了模型,它就会变得更加混乱。
git存储库只是一个对象树,它解释了如何将目录从一种状态转换为另一种状态。那些对象有父母。有些对象有两个(或更多)父母;合并。有些对象没有父母;最初的提交。
据我所知,在内部,Subversion的模型类似于减去合并来自的概念。这些只是新的提交,有一个方便的命令(svn merge
),用于获取两个其他提交之间的差异补丁。
我实际上经常使用此功能来管理从不同主机上的同一目录开始的配置文件,例如/etc/apache2
。这就像说,“这是这个东西的替代开始,但它已被抛弃”。它允许我在覆盖它们之前隐藏某些文件的状态,但不必担心它们是否合并,或者甚至与主分支有关。
在Subversion中,我必须将备份存放在某个不相关的地方(zip文件某处)或存储库的子目录中。另外,在subversion中,如果我在树的当前视图中删除对这些文件的任何引用,则很难再次找到它们。