Git和CVS的区别Git和CVS的区别(Difference between GIT and CV

2019-05-12 15:06发布

什么是Git和CVS版本控制系统之间的区别?

我一直愉快地使用CVS了10多年,现在我已被告知,Git是更好。 可能有人请解释两者之间的区别是什么,为什么一个是比其他更好吗?

Answer 1:

主要的区别是,(因为它是在其他的反应已经说过)是CVS(旧)集中的版本控制系统,而Git是分布式的。

但是,即使你使用的单个开发者版本控制,单机(单一账户)上,有Git和CVS之间的一些区别:

  • 建立资料库 。 Git的存储仓库放在.git在项目的顶级目录目录; CVS需要建立CVSROOT,用于存储不同的项目(模块)的版本控制信息的中央位置。 该设计对于用户的结果是导入现有源版本控制是一样简单“的git的init && git的补充。&& git的承诺”在Git中,虽然它是比较复杂的CVS。

  • 原子操作 。 由于CVS在开始是一套围绕每个文件RCS的版本控制系统的脚本,提交(等操作)不在CVS原子; 如果在存储库的操作在中途中断,仓库可以处于不一致的状态。 在Git的所有操作都是原子:他们要么成功,因为整体,或者失败,没有任何变化。

  • 变更 。 在CVS变化是每个文件,而在Git的变化(提交)他们总是指整个项目。 这是非常重要的范式转变 。 一本的后果是,这是很容易在Git中恢复(创建撤销改变)或撤消整个变化; 其他的后果是,在CVS是很容易做到的部分检出的,而这是目前在Git中几乎不可能。 一个事实,即改变每个文件,分组在一起导致GNU变更记录格式在CVS提交消息的发明; Git的用户使用(和一些Git的工具期望)不同的约定,以单行描述(汇总)的变化,其次是空行,其次是改变的更详细的描述。

  • 命名版本/版本号 。 有一个事实,即在CVS的变化是每个文件连接的另一个问题:版本号(你可以在关键字扩展有时会看到,见下文),如1.4反映了多少时间给定文件已被更改。 在Git的项目的每个版本作为一个整体(每次提交)已经SHA-1号的唯一性名称定; 通常第7,8个字符足以确定一个提交(不能使用在分布式版本控制系统版本简单的编号方案 - 需要中央编号机构)。 在CVS有版本号或符号名称指的是项目的国家作为一个整体使用标签 ; 如果你想使用的名称,如“v1.5.6-RC2”的一些版本的一个项目,同样是在Git中真...但在Git标签更容易使用。

  • 易分支 。 在CVS分支在我看来过于复杂,难以对付。 你必须标记分支有一个名称为整个资源库分支(甚至可以在某些情况下会失败,如果我没有记错,因为每个文件处理)。 添加到这一事实,CVS没有合并跟踪 ,所以你必须要么记住,或者手动标记合并和分支点,并手动供应“CVS更新-j”正确的信息合并分支机构,它使分支是不必要很难使用。 Git中创建和合并分支是很容易的; Git的记忆本身所需的全部信息(这样合并的一个分支是“混帐合并分支名称 ”一样简单)......它必须,因为分布式开发自然会导致多个分支。

    这意味着您可以使用特性分支 ,即发展在不同的特性分支多个步骤的单独的功能。

  • 重命名(及复印件)跟踪 。 文件重命名未在CVS支持和手动重命名可能会破坏两个历史,或导致无效的历史,你不能正确地重命名,然后才能恢复项目的状态。 Git使用启发式重命名检测的基础上,内容和文件名(此解决方案以及在实践中)相似。 您也可以要求复制文件的检测。 这意味着:

    • 当检查规定提交一些文件被重命名你会得到的信息,
    • 正确合并改名需要考虑(例如,如果该文件是在一个分支仅重命名)
    • “混帐怪”的“CVS注释”中,(更好),相当于,一个工具,显示的文件内容系明智的历史,可以按照代码运动也跨越重命名
  • 二进制文件 。 CVS只有二进制文件(例如图像),要求用户增加时,明确地标记二进制文件(或更高版本使用“便利店管理”,或者通过包装做自动根据文件名),以避免忙玲非常有限的支持通过结束线转换和关键字扩展二进制文件。 Git的自动检测基础上以同样的方式CNU diff和其他工具做内容的二进制文件; 您可以使用gitattributes机制覆盖此检测。 此外二进制文件是针对不可恢复的mangling由于拖欠“safecrlf”安全(和你有权要求结束在线变换的事实,尽管这可能会在默认情况下根据分配开启),以及(有限)的关键字膨胀是在GIT中严格的“选择加入”。

  • 关键字扩展 。 相比CVS(默认)的Git提供了一组非常,非常有限的关键字。 这是因为两个事实:在Git的变化是每个存储库,而不是每个文件,和Git避免切换到另一分支或倒带在历史上的其他点时有没有改变修改文件。 如果你想使用Git嵌入版本号,你应该这样做使用您的构建系统,如下面的例子在Linux内核源和Git中源GIT-VERSION-GEN脚本。

  • 修订提交 。 因为在分布式VCS如出版的GIT中动作是从创建一个单独的提交,一个可以改变(编辑,改写)历史的未公开的部分,而不感到不便的其他用户。 特别是,如果你发现错字(或其他错误)在提交信息,或者在错误提交,你可以简单地使用“git的承诺--amend”。 这是不可能的(至少在没有重两轮牛车)在CVS。

  • 更多工具 。 混帐提供比CVS更多的工具。 一个更重要的是“ 混帐平分 ”,它可以用来找到一个提交(修订版)介绍了一个bug; 如果您提交小而自足它应该很容易,然后发现其中的错误是。


如果您有至少一个其他开发人员合作,你会发现也Git和CVS之间的以下区别:

  • 提交前合并 Git使用提交-前合并 ,而不是像CVS, 合并-前提交 (或更新,然后提交 )。 如果当您正在编辑的文件,准备创建新的提交(新修订)人等创造了新的承诺在同一个分支,它现在是在库中,CVS迫使你先更新工作目录,并允许你提交之前解决冲突。 这不是使用Git的情况。 您第一次提交,保存状态的版本控制,那么合并其他开发人员的变化。 你也可以问问其他开发商做的合并和解决冲突。

    如果你喜欢有线性的历史,避免合并,你总是可以通过使用“git的变基”(和“混帐拉--rebase”),这是在类似CVS您重播顶部更改提交合并,重新作出的工作流程更新的状态。 但你总是犯第一。

  • 无需中央存储库使用Git没有必要有,你提交你的修改单中心位置。 每个开发人员都可以拥有自己的存储库(或更好的数据存储:私企中,他/她做开发,公共裸露一个她/他出版那部分是准备好),他们可以拉/读取相互库,在对称的方式。 在另一方面,它是常见的大项目已经社会定义/指定的中央资料库,每个人都从拉(从获得的变化)。


最后,与需要大量的开发者合作时的Git提供了更多的可能性。 下面有Git中的一个项目(使用CVS或Git版本控制)CVS之间的差异的兴趣和位置不同的阶段:

  • 潜伏者 。 如果你感兴趣的只是从项目获得最新的变化,( 没有更改传播 ),或做私人开发(不含贡献回到原来的项目); 或者您使用外资项目作为自己的项目的基础上(变化是局部的,不会是有意义的发布它们)。

    这里的Git支持通过自定义快捷匿名未经身份验证的只读访问git://协议,或者如果你是后面的防火墙阻止DEFAULT_GIT_PORT (9418),可以使用普通的HTTP。

    对于CVS最常见的解决方案(据我所知)为只读访问是来宾帐户上“的pserver”协议CVS_AUTH_PORT (2401),通常被称为“匿名”和空密码。 凭据默认情况下,在存储$HOME/.cvspass文件,所以你必须提供它只有一次; 不过,这是有点障碍的(你要知道来宾帐户的名称,还是要注意CVS服务器消息)和烦恼。

  • 条纹显影剂(叶贡献者)。 在传播OSS更改的一种方式是通过电子邮件发送补丁 。 这是最常见的解决方案,如果你是(或多或少)意外的开发商,送单的变化,或单bug修正。 BTW。 发送补丁可能是通过审查委员会(补丁审查制度)或类似手段,不仅通过电子邮件。

    这里的Git工具提供了在这个传播(发布)机制既为发送方(客户端)的帮助,并为维护(服务器)。 对于谁希望通过电子邮件发送给他们的变化人有“ git的变基 ”(或“混帐拉--rebase”)工具来重播自己对目前的上游版本之上的变化,所以你的改变是当前版本的顶部(新鲜),和“ 混帐格式补丁 ”,以创建一个提交的信息(和作者),在(扩展)统一的diff格式(加上diffstat,便于审核)的形式变化的电子邮件。 维护者可以直接将这类电子邮件到提交保存的所有信息使用“(包括提交信息) 混帐上午 ”。

    CVS不提供这样的工具:您可以使用“CVS比较” /“CVS rdiff命令”产生的变化,并使用GNU补丁应用更改,但据我所知是没有办法自动将提交信息。 CVS是意味着客户可以使用< - >服务器时尚...

  • 中尉 。 如果你是一个项目(子系统)的独立部件的维护,或者如果你的项目的开发遵循Linux内核的开发使用工作流程“信任网络” ...或只是如果你有自己的公共仓库,以及改变你要发布太大通过电子邮件作为贴片系列送,您可以发送拉要求项目(主)的维护者。

    这是特定于分布式版本控制系统的解决方案,所以当然CVS不支持协作的这样的方式。 甚至有一个叫“混帐要求拉”,帮助准备电子邮件发送与请求的维护者从您的仓库拉工具。 由于“混帐捆绑”您可以使用此机制,即使没有公共仓库,通过电子邮件或发送sneakernet变化的捆绑。 有些Git的托管网站像GitHub的对您的项目通知,有人在工作(发表了一些作品)支持(前提是他/她使用相同的Git托管网站),以及PM-ING一种拉请求。

  • 主要开发者 ,即有人谁直接发布他/她的改变(主/规范库)。 该类别用于分布式版本控制系统更广泛的,具有多个开发人员提供了中央版本库的写访问不仅是可能的工作流程(你可以有一个维护者谁修改规范库,一组副手/子系统的维护者,从他/她拉手,以及广泛的叶开发谁通过邮件发送补丁要么维护者/项目的邮件列表,或中尉/ submaintainers之一)。

    使用Git你必须使用SSH协议 (包裹在SSH Git协议)发布变更,工具,如“混帐壳”的选择(以帮助安全,限制shell帐号的访问)或Gitosis的 (不需要单独的shell账户管理访问)和HTTPS使用WebDAV,与普通HTTP认证。

    随着CVS有哪些集中的版本控制系统是指提交你的修改(创建提交)自加密(纯文本) 的pserver协议,或使用远程shell(如你真的应该使用SSH)发布的更改之间的选择。 好了,你也可以使用SSH隧道“PSERVER”协议,并有锡尔第三方工具自动执行此...但我不认为这是因为如Gitosis的那样容易。

在一般的分布式版本控制系统,如GIT中,提供可能的工作流的更广泛的选择。 使用中心版本控制系统,如CVS,必然有你的人提交访问存储库之间的区别,而那些没有......和CVS不提供任何工具来帮助人们从接受捐款(通过补丁)无提交权限。

卡尔·福格尔在产开源软件的版本控制状态,最好是不提供的,其中一个被允许更改公共仓库区过于严格,刚性和严格的控制部分; 它是更好的依赖(这)在比技术限制社会限制(如代码审查); 分布式版本控制系统减少恕我直言,甚至进一步...

HTH(希望帮助)



Answer 2:

Git是一个分布式版本控制系统 ,而不是CVS是一个集中的一个。 简单的描述是:你获得的版本控制的所有好处,当你没有连接到任何多个可能的资源库,再加上操作的速度更快。



Answer 3:

Git的网站解释了这个最好的可能。

我的宠物功能是能够做离线时提交。 和速度,绝对惊人的速度在这一切,除了推拉发生。 (而这些操作是由设计破坏性的,所以当你去喝杯咖啡,如果你的中央回购是滞后的,你可以推/拉。)的另一个好处是,它的电池包括:内置的gitk是一个足够好的浏览器的历史; git gui是一个足够好的提交工具; 与输出彩色, git add -igit add -pgit rebase -i足够良好的人机交互界面; git daemongit instaweb如果你不想/无法与您的中央回购拨弄是临时的协作不够好。



Answer 4:

我也是CVS的10年以上大多是快乐的用户,虽然我也很喜欢git的,并且随着时间的推移会喜欢它,但最让我对目前的工作项目都使用CVS,或svn,我们似乎无法让我工作的地方深信,让我们通过防火墙冲个混蛋孔的官僚制。

一对夫妇的事情,让CVS更好比原本可能是cvsps,另一种是无论是Andrew Morton的补丁脚本,或被子。 Cvsps让你重建的多个文件提交到一个单一的补丁(从而提取CVS“变更集”),而被子,或Andrew Morton的补丁脚本可以很容易地,舒适地提交明智的“变更”到CVS,让你在复式的东西,同时仍保持之前提交它们分开同时工作。 CVS有它的怪癖,但我已经习惯了其中的大多数。



Answer 5:

“愉快地使用CVS超过X年”,是一个有趣的想法:-)这是一个巨大的一步,从保持大量的拷贝,但是...

我猜你已经习惯了这一切的怪癖,还是不要做太多的分支和合并。 有一个糟糕的可能性;

组织中的人们已经习惯了CVS的局限性和您的工作实践已经相应调整;

例如从不具有在时间上的一个包一个以上开发者的工作,只使用在紧急情况等支化

其基本原理是更困难的事情是,少人这样做。



文章来源: Difference between GIT and CVS