git branch与git repository,我应该使用哪一个?

时间:2011-04-04 19:12:04

标签: git

哪一个占用更多磁盘空间?你如何跟踪错误修复(我们正在使用Jira)?您如何知道哪个分支或存储库有错误修复?存储库vs分支必须有其他优点/缺点吗?

4 个答案:

答案 0 :(得分:11)

你的问题没有多大意义。存储库始终包含至少一个分支,并且您不能拥有没有存储库的分支。当然,分支比存储库小。这两者并不是真正可比的东西。

所以,让我们谈谈Git存储库实际包含的内容。主要有几点:

  • 工作树 - 这是您所有文件的当前状态,即您正在处理的文件。这可能会占用相当大的空间。

  • 对象 - 这些是git存储内容的方式 - blob表示文件内容,树表示目录结构,提交表示工作树的快照。这是真正需要空间的另一件事。

  • 引用 - 引用的缩写:分支或标记。这些非常非常轻量级 - 它们只是指向特定提交的指针。它们确实占用了一点空间,但是它很少,你应该把它们视为完全自由。标签是固定参考;他们永远指向一个提交,并用于标记版本之类的东西。分支是可移动的参考;签出后,它会在您提交时前进。它们是你用来表示开发线的东西 - 一个稳定的分支,一个特定的bugfix或功能的分支,你可以命名它。

除了对象和引用之外,.git目录中还有其他内容,但现在不关心它们。

  

如何跟踪错误修复(我们正在使用Jira)?您如何知道哪个分支或存储库有错误修复?

这取决于你。通常,人们最终会在其提交消息中嵌入一些信息,以表明它们可以解决某些特定的错误/问题。您应该有一个已定义的工作流,您可以在自己的分支上(或者可能是以前版本之上的维护分支)进行错误修正,并将它们合并到当前的开发分支中,从而与未来版本共享错误修正。您应该可以说“主要和维护分支始终具有所有错误修复” - 但是如果要检查,您可以执行类似git log --grep='bug 1234'的操作,假设您已将该字符串放入提交中消息!

通常,不需要具有同一项目存储库的多个克隆。你可能有一个中心的,每个开发人员都有自己的 - 但是当开发人员发布他们的工作时,他们会把它放在中心的那个,而那就是重要的一切。

答案 1 :(得分:4)

在同一个仓库中创建一个分支总是几乎没有任何成本(从技术上讲,它取决于你在分支中放置的内容,但我确信这一点很清楚)。

克隆存储库时, 最终会有两倍的存储要求(包和工作树)。但是,这可能会让您相信克隆存储库必然是次优的事情。让我告诉你为什么这不总是正确/

repo实际上只是分支引用的集合。分支实际上(如在深度复制中)与repo一样多,除了特定分支的提交中的blob。 (通常没有太大区别)。

在本地,您可以在几乎没有额外费用的情况下克隆回购,因为它可以是硬链接的(在同一个文件系统中)。另外,通过克隆到一个裸仓库可以避免使用另一个工作树所产生的成本(例如,使用git clone --mirror)。

在项目中

在我看来,回购对应于分布式工作流程中的“玩家”。玩家可以是“自然人”或“角色代理人”。我有

  • 中央回购(具有网络连接,因此我可以在任何地方推动和拉动)
  • 工作回购(每个工作站一个;带有与ProofOfConcept,合并,微提交等相关的临时和临时分支)。
  • 备份回购
  • [如果上游开发人员在github上,可能是拉取请求的github克隆]

实际上,只有3-4种类型的分支在所有repo(master,maint,testing,unstable)中共享。

在项目外面

当然,一个项目将拥有它自己的回购(大部分时间)。我开始倾向于使用子模块,因为它似乎比异构分支更灵活(即同一个回购的不同分支中的不同项目)

拥有单个回购的一大好处是,将关联的工作树从一个分支切换到另一个分支将非常顺利。公平地说,这种差异可以在两个方向上发挥作用:

  • 您可以通过将工作树添加为远程
  • ,将工作树切换到另一个存储库中的分支
  • 通过覆盖GIT_WORKTREE环境变量,您可以使用“非本地”工作树进行单独(甚至裸露)回购工作

你看,当你以这种方式看待它时,一个回购开始是一个分支的集合,与一个工作树或多或少的协调关联。这些约定出现了真正的差异:你通常使用repo来管理分支和不同工作树的集合。

答案 2 :(得分:2)

对我而言,存储库应该包含一个独特的项目。分支是项目开发的“途径”。所以你可能有一个开发分支,一个生产分支,一些功能分支,以及一些bug修复分支。分支可以根据需要相互合并,最终合并到开发和生产中。

磁盘空间:整个存储库比创建分支更大,因为分支在第一次创建时实际上只是一个指针,而整个存储库需要重新存储所有git文件。

答案 3 :(得分:0)

回购中的分支也具有超越其他评论的优势。许多图形(或文本UI)工具可以向您显示有关回购中分支上的提交/标记/等的信息。如果您每次想要破坏开发时创建新的存储库,那么这些数据就不可用了。

使用内部分支时,您还可以更轻松地表达分支关系的分支。它在那里很自然,而有了额外的回购,你必须在外部跟踪和管理这种关系。

相关问题