什么是Git和Subversion呢?

时间:2010-02-13 20:11:09

标签: svn git version-control repository github

我看到很多网站都提到了git,github,svn,subversion等,但我从来都不知道所有这些都是什么。我也听过很多像'svn repo','commit'和'push'这样的术语 - 我试过谷歌搜索,但似乎我对这个主题知之甚少,我甚至不知道从哪里开始。< / p>

有人能给我初步推动,所以我可以继续自己研究吗? 这些事情到底是什么?

谢谢!

伙计们:非常感谢你们所有长期而且包罗万象的解释。我希望我可以选择不止一个答案,但不幸的是,SO不允许这样做(他们应该有第1,第2和第3位投票功能或其他东西)。非常感谢你们!

7 个答案:

答案 0 :(得分:23)

版本控制(a.k.a。版本控制)。

考虑以下问题。您正在与其他人一起开展项目,并且您正在共享文件。你们都需要工作,比如“WhateverController.java”。这是一个巨大的文件,你们都需要编辑它。

处理这个问题最原始的方法是不要同时编辑文件,但是你们两个都必须在同一页面上。当你有一个团队时,特别是如果团队有几十个或几百个或几千个成员(典型的开源项目),那就完全不可能了。

这个问题的一个古老的,原始的“解决方案”是有一个结账/签到机制。当你需要编辑文件时,你“检查出来”,文件被锁定,所以没有其他人可以编辑它,直到你通过“检入”解锁它。这是通过适当的软件完成的,例如微软令人叹为观止的愚蠢的废话SourceSafe。但是当人们忘记“检查文件”时,没有其他人可以在使用时编辑该文件。然后有人去度假或出于其他原因离开项目,结果是无休止的混乱,混乱和通常相当多的丢失代码。这增加了巨大的管理工作。

然后是CVS,随后是Subversion,作者称之为“CVS做得对”,因此CVS和Subversion基本上是相同的想法。有了这些,没有实际的退房。您只需编辑所需的文件并将其签入。请注意,实际文件存储在中央服务器上,每个用户也在自己的工作站上运行该软件。服务器上的此位置称为存储库。

现在,如果两个人在CVS / Subversion中处理同一个文件会发生什么?它们被合并,通常使用GNU diff和patch。 'diff'是一个实用程序,可以提取两个文件之间的差异。 'patch'使用这样的'diff'文件修补其他文件。

因此,如果你正在一个函数中使用WhateverController.java,并且我正在使用不同的函数处理同一个文件,那么当你完成了你的东西时,你只需要检查它,然后进行更改应用于服务器上的文件。同时,我的本地副本不知道您的更改,因此您的更改根本不会影响我的代码。当我完成更改后,我也会检查文件。但现在我们有这种看似复杂的情况。

让我们调用原始的WhateverController.java,文件A. 您编辑该文件,结果是文件B. 我在不同的位置编辑同一文件,没有您的更改,此文件是文件C.

现在我们似乎有问题了。文件B和C的更改都是对文件A的更改。因此,在像SourceSafe或Dreamweaver这样可笑的向后垃圾通常会最终覆盖文件B的更改(因为它首先被检查)。

CVS / Subversion,可能是Git(我几乎一无所知)创建补丁而不是仅仅覆盖文件。

产生文件A和C之间的差异并成为补丁X.产生A和B之间的差异并成为补丁Y.

然后补丁X和Y都应用于文件A,因此最终结果是文件A +对我们各自工作站上的B和C所做的更改。

通常这种方式完美无瑕。有时我们可能在相同的代码中处理相同的函数,在这种情况下,CVS / Subversion将通知程序员一个问题,并在文件本身中呈现问题。这些问题通常很容易解决,至少我从未解决过这些问题。 Visual Studio,Project Builder(Mac OS X)等图形工具通常会向您显示文件和冲突,因此您可以选择要保留哪些行以及要丢弃哪些行...然后您还可以编辑如果要手动合并冲突,请手动创建文件。

因此,从本质上讲,源代码控制是解决多个人处理相同文件的问题。基本上就是这样。

我希望这可以解释。

编辑:像Subversion和Git这样可靠的源控制系统还有很多其他好处。如果出现问题,您可以返回其他版本,这样您就不必手动备份所有内容。事实上,至少对Subversion来说,如果我搞砸了一些东西或者想看看旧版本的代码,我可以这样做而不会干扰别人的工作。

答案 1 :(得分:9)

GIT,Subversion等都是关于版本控制的。如果您将这些技术用于项目,则所有源文件都存储在所谓的存储库(也称为“repo”)中 - 除了不需要版本控制的文件(大文件,用户特定文件......)

版本控制的一些优点是:

  • 分支。您可以为正在处理的每个错误创建一个新分支,例如,不会篡改其他开发人员的代码。大多数版本控制系统都会制作廉价的副本,即一个新的分支将占用(几乎)没有额外的空间。
  • 版本控制。您可以随时返回旧版本,更新到新版本或查看提交日志以查看代码上发生了什么。像TortoiseSVN这样的GUI工具甚至提供了差异工具,可以用图形方式显示差异。术语“提交”基本上意味着将新版本的文件放入存储库(或添加/删除文件)。版本控制系统还支持“合并”,即自动合并由多人(通常是基于行)更改的文件的更改。
  • 同步开发。多个开发人员可以拥有自己的“工作副本”(也称为“结帐”)。这意味着 - 即使您不使用分支 - 您的本地代码副本也会编译,即使其他人当前正在处理该项目(因为他们有自己的工作副本)。当您认为当前代码对其他人有用时,您可以提交更改,其他人可以更新其副本。
  • 集中存储和备份。这对CVS / Subversion / ...有效,而不适用于GIT。这是一个优势,因为有一个中心位置可以提交更改,并从其他开发人员那里获取更改。
  • 分发。但这对GIT(不适用于Subversion)有效。这意味着项目可以有多个存储库,彼此独立。例如,Linux内核就是这样。人们可以“拉”他们自己的工作库 - 它就像一个完整的存储库,即提交是在本地而不是服务器。如果您想要包含来自其他人的存储库(或来自 kernel.org 等公共存储库)的补丁,您只需将这些更改“拉”到您的本地存储库即可。如果你想给别人你的补丁,你可以将你的更改“推”到远程仓库(如果你有权利)。

希望解释你提到的条款。我认为开始使用版本控制的一个良好开端是Subversion,如果可能的话使用TortoiseSVN for Windows。甚至有一本免费的书 - Version Control with Subversion

答案 2 :(得分:8)

它们都是源代码控制的不同版本:

http://en.wikipedia.org/wiki/Revision_control

答案 3 :(得分:7)

答案 4 :(得分:4)

Git和Subversion(也称为svn)是源代码控制或版本控制或修订控制系统。它们可以帮助您管理源代码并跟踪系统管理的每个文件的更改历史记录。维基百科文章metismo链接可能会有所帮助。

github是一个托管和管理git存储库的服务。它基本上将存储库放在网上,以便多人与存储库进行交互。

commit命令通常将一组更改存储到源控件存储库中。这将在存储库中创建一个新版本。

push命令仅适用于分布式版本控制系统,如git或mercurial(也称为hg)。 Push允许将更改从一个存储库移动到另一个存储库。分布式版本控制系统的概念是每个用户都有自己的存储库。当用户完成更改时,用户会将其推送到其他存储库(可能是中央项目存储库,或者作为另一个用户存储库的补丁)。

这些系统的重点是

  • 存储开发过程的历史记录
  • 加强多个开发人员之间的协作
  • 允许恢复和修复旧版本的代码
  • 将源代码更改为特定功能或错误(请参阅fogbugz和kiln)
  • 为实验或并行开发创建代码(分支)的变体

答案 5 :(得分:2)

源代码库。

基本上是一种在团队之间共享代码的方法,能够看到谁在什么时间“提交”(添加)了什么代码,以及谁在什么时候改变了什么等等。

答案 6 :(得分:2)

查看(免费,在线)subversion book的第一章。它描述了什么版本控制系统(例如颠覆)。