有人可以向我解释源(版本控制)控件吗?

时间:2008-12-21 02:21:50

标签: version-control

我从未参加过一个团队的专业项目,因为我还在上高中。因此,我从来没有接触到这整个“版本控制”和“源代码控制”的事情。它们是一样的吗?管理代码的程序究竟如何管理代码?我听说你必须检查代码(复制现有代码?)并将其合并(如果有人更改了你没有改变的代码并且你改变了其他内容并将其合并,会发生什么?当然,他的代码是不会被您的旧版本所取代。)最后,这类软件最好/最简单的例子是什么?

10 个答案:

答案 0 :(得分:18)

  

我听说你必须查看代码   (复制现有代码?)并合并它   回来(如果有人会怎么样   更改您未更改的代码   你改变了别的东西   合并吧?当然,他的代码不是   替换为旧版本。)

这正是版本控制的原因。如果它只是盲目地覆盖了人们的代码,它真的不是一个非常有用的工具,不是吗? ;)

源代码管理工具维护一个存储库,其中包含代码库的整个历史记录。每个更改都以增量形式签入,保存已更改的内容。这意味着如果你和我都签出版本A,然后我编辑文件B,你编辑文件C,我们都签到,源控制软件将比较差异和没有冲突的地方(如本例所示) ),只应用两个更改,如果发生冲突(如果我们都更改了相同的代码行),它会拒绝尝试的签入并告诉您文件的哪两个版本有相互冲突的更改,并要求您手动合并它们。 (通常它也能够突出显示更改,以便您可以直观地看到每个版本中已更改的内容)。 所以它永远不会覆盖变化。

它将为您做的其他任务是:

  • 标记特定版本或里程碑 这样你就可以轻松找到它们了 以后(这是我们的版本 最后修复了烦人的bug#2524, 这是beta 1,依此类推。
  • 将存储库分成两部分, 允许可能出现的变化 同步“temporarliy,甚至停留 永远分开产品(想想 PHP同时维护他们的 PHP4分支,同时也在努力 PHP5。在某些时候他们是模拟的 这样分支他们的代码库 他们可以开始相同 现在应用补丁到没有 影响另一个)。当然吧 也可以尝试合并这些 分支回到一起(你可以 为每个专业创建一个分支 或许,你的产品中的功能 它们可以孤立地开发 不受影响 渐进的变化发生在 其余的代码,然后当 功能完成,合并其分支 回到主存储库)

源控制工具有两种基本类型,即集中控制工具和分布式控制工具。分布式是重大新事物,而集中化已与我们合作数十年。简而言之,集中式版本控制只是意味着有一个主存储库服务器,其中存储了所有分支和每个分支的更改历史记录。此服务器负责合并签入和所有这些。因此,每当开发人员检查代码或将其提交到存储库时,这就是他同步的服务器。 分布式的只是放弃了这个“主服务器”的方面。相反,每次检查代码时,都会在您自己的计算机上本地创建一个新的存储库,在您检查代码的路径上。然后,您可以处理此本地存储库,它执行所有相同的操作,跟踪更改历史记录,合并更改等等,一旦准备好,您就可以将存储库合并到任何其他存储库中。通常情况下,您可能希望将其合并到某种“主”仓库中,其中所有代码都粘在一起,但您也可以将其合并到您的代码开发人员的本地仓库中,如果他需要您正在处理的功能,但它还不够稳定,不能进入主要的回购。因此,它为您提供了更大的灵活性,并允许您维护本地工作的更改历史记录,而不会破坏主存储库中的构建(在集中式设置中,如果您检入无法编译的内容会发生什么?整个团队都被搞砸了,直到它被修复了。如果你没有检查它,你将失去版本控制的好处,如果你发现你已经被遗忘,你将无法恢复到以前的版本引入新的错误)

  

最后,是什么   这种类型的最好/最简单的例子   软件

嗯,最受欢迎的是SVN,这是一个老式的集中式系统,但设置imo有点痛苦。需要服务器上的特殊软件。 我个人非常喜欢分发的Bazaar,服务器存储库只需要FTP访问,服务器上没有别的东西。

答案 1 :(得分:11)

Eric Sink写了一篇不错的Source Control HOWTO

免责声明:Eric Sink是SourceGear的负责人,负责开发和销售多种与源代码管理相关的工具(包括SourceGear Vault)。但是,Source Control HOWTO是一个非常中立,平衡的写作。

答案 2 :(得分:7)

我相信this article解释了大部分问题的答案。

答案 3 :(得分:5)

版本控制系统不仅适用于大型团队!从事爱好项目的个体开发人员可以通过版本化代码获得很多好处。

大多数版本控制系统都以存储库的概念为中心,该存储库由系统管理,从不直接触及。如果要编辑文件,请从存储库中复制文件,进行更改,然后将其发回。版本控制系统识别新版本和旧版本之间的差异,然后将新版本存储在存储库中。但是,如果你搞砸了,旧的版本,一直回到开头,总是可以检索。

大多数版本控制系统足够智能,可以在同一文件中合并来自多个开发人员的更改,只要更改不会影响文件的同一部分。然而,合并冲突可能会发生并导致头痛。

要开始使用,我建议您安装一些简单且免费的内容,例如Subversion,并查看非常详细的book,其中包含各种功能的示例和说明,其中大多数功能与其他版本相比较控制系统。

答案 4 :(得分:5)

所有版本控制系统基本相同。没有比其他版本更难使用.. svn commit somefilegit commit somefile一样困难。它们的工作方式有点不同。< / p>

我开始使用git的唯一原因是因为github。之前我使用SVN而不是darcs(它有一个非常好的命令行界面)的唯一原因是因为我找到了一个好的,免费的SVN服务器。

目前我会推荐git。不是因为它更好,或者因为其他一些VCS更糟糕,而是因为有很多非常好的指南,以及许多使用/基于它的非常好的项目。

您可能会发现一些有用的资源:

  • GitHub - 说服我开始使用git的原因。它有一个非常活跃的社区,非常有用(例如,当您创建一个新的存储库时,它会为您提供将代码推送到它的命令)。他们也有一个很好的guides部分。
  • 免费screencast about using GitHub - 解释了许多网站功能以及大多数有用的基础知识
  • Gitorious - 另一个好的git托管网站,用于开源项目(该网站本身也是开源的)。我不会像GitHub那样好用,但这是一个非常好的选择。
  • repo.or.cz - 第一个git托管网站。与GitHub / Gitorious相比,相当古老,但它有效,并且主机
  • PeepCode's Git episode - 9美元,但被认为非常高。几乎涵盖了你需要知道的一切。
  • GitCasts - 一系列精彩的截屏视频。从第一个开始(“设置,初始化和克隆”),它应该涵盖大多数有用的东西。
  • GitMagic - 非常有用,特别是对于稍高级的东西(它回答了很多我的“我如何...”的问题,比如如何创建一个空分支)。综合指南(从基本内容到git的内部)
  • Git for beginners: The definitive practical guide - 关于stackoverflow的问题 - 还不完全全面,但它已经到了那里..

所有这一切,与你选择的版本控制系统无关,真的......

我发现darcs非常容易使用(它都是CLI,并了解darcs get如何在存储库之间移动“补丁”。"GettingStarted" darcs.net wiki page是我开始所需的全部内容我遇到的唯一问题是我找不到darcs项目的主机......

SVN易于使用,但它的集中式架构并不适合我使用它的方式,而且分支(在git中很简单)之类的东西很难。几乎每个动作都需要与中央服务器通信,我不想运行本地SVN服务器。它也基本上不能在笔记本电脑上脱机工作。

我开始学习SVN,主要归功于"introduction to Subversion screencast"。然后,当我发现github时,我使用git svn将我的主要SVN存储库导入git

简而言之:为某些版本控制系统找一个好的教程或指南,并版本化所有随机项目和片段。在您意外地进行一些愚蠢的更改并保存/关闭脚本或意外删除某些内容之前,这似乎有点无意义。我几乎使用VCS作为“超级撤消”(并且用于计算机之间的代码同步)

答案 5 :(得分:3)

版本控制和源代码控制是相同的。好吧,主要是。版本控制是Source Control的功能。它允许您拥有文件的多个版本。可以把它想象成维基百科的修订历史。您可以返回,查看已完成的工作,比较更改并回滚到以前的代码。

该程序通常使用一些专有引擎来监视这些文件(因为它们只是文本,通常并不困难),并且它会跟踪每次重新检入文件时所做的更改。

如果您尝试合并已更改的文件,大多数源代码控制系统会显示文件的差异,您可以选择手动或自动合并(取决于您的Source控制系统的功能有多强大)。

最简单的示例是download Subversion onto your USB drive,并安装Tortoise SVN

答案 6 :(得分:1)

以下是您的问题的一些答案:

源代码管理是每个人共享代码的地方。如果要进行更改,请“签出”代码并进行修改。当您检出它时,没有其他人可以对其进行更改(从而阻止您修改该文件的旧版本)。完成后,将文件检入源控件,创建新版本(这是源代码管理的版本控制部分)。在任何时候,您都可以将代码库的本地副本与所有文件的最新版本重新同步,从而使您保持最新。

执行此操作的某些软件使用更改系统。这意味着该文件只有一个副本,无论何时签入,都会保存为该文件的一系列更改。其他系统存储文件的多个副本,并将版本信息附加到文件中。

如果您要更改旧版本的文件,然后发现您使用旧版本(源代码管理程序应该在您尝试检入代码时通知您),那么您必须合并更新版本更新。一些源代码控制工具带有内置的合并工具。

答案 7 :(得分:0)

回答你发布的第二个问题:

SVN需要一个集中的存储库,而Git是分散的,但我认识的大多数使用它的人都依赖于github。此外,Git用于linux内核源代码的主干,因此它针对非常大的代码库进行了优化。此外,Git似乎有更好的处理分支合并然后pre-svn 1.5.x代码。

答案 8 :(得分:0)

版本控制不需要是一个复杂的设置,也不仅仅适合在团队环境中工作,它不仅适用于编码项目。任何东西都可以进入版本控制。这只是一个不想失去任何东西的问题。我版本控制几乎我编辑的每个文件,包括我家里的所有文件/以及等等/和其他地方的大量配置文件,我版本我为工作所做的一切(除了为项目提供的版本控制)。这是我所做的一部分,我认为它应该由文件系统提供。

我建议开始简单并使用RCS练习。尽管RCS对于团队来说很糟糕,但只管理一个作者就可以管理本地用户文件。暂时不要关注合并和分支。学会将文件保存为保存版本的意义。一旦您对RCS感到满意并接受保留更改的好处,您就可以升级到学习SVN或Git或任何其他真正的系统,这些系统更强大,更适合团队环境。

答案 9 :(得分:0)

另请查看Streamed Lines paper它描述了一些最佳做法和版本控制反模式,我还要提及迈克尔伯尔提到的Erik Sinks articles的引用