GIT和CVS之间的区别

Git和CVS版本控制系统有什么区别?

我已经高兴地使用CVS超过10年,现在我被告知,Git是好多了。有人可以解释一下两者之间的区别是什么,为什么一个比另一个更好?

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

但是即使你对单个开发人员使用版本控制,在单机(单个帐户)上,Git和CVS之间也有一些区别:

>设置存储库。 Git存储库在.git目录在项目的顶层目录; CVS需要设置CVSROOT,用于存储不同项目(模块)的版本控制信息的中心位置。对用户的设计结果是,将现有源导入版本控制与Git中的“git init&& git add。&& git commit”一样简单,而在CVS中为more complicated
>原子操作。因为CVS在开始时是围绕每个文件的RCS版本控制系统的一组脚本,提交(和其他操作)在CVS中不是原子的;如果对存储库的操作在中间被中断,则存储库可以处于不一致的状态。在Git中,所有操作都是原子操作:它们都是成功的,或者没有任何改变。
>更改集。 CVS的更改是每个文件,而在Git中的更改(提交)它们总是引用整个项目。这是非常重要的范式转移。这样做的一个后果是,在Git中很容易恢复(创建撤消的更改)或撤销整个更改;其他结果是在CVS是容易做部分检出,而它目前是不可能在Git。变化是每个文件,分组在一起导致发明的GNU Changelog格式的提交消息在CVS; Git用户使用(和一些Git工具期望)不同的约定,用单行描述(汇总)更改,后面跟着空行,随后是更详细的更改描述。
>命名修订版本/版本号。还有另一个问题与在CVS更改是每个文件的事实:版本号(如有时可以看到关键字扩展,见下文),如1.4反映了多少时间给定的文件已更改。在Git中,每个版本的项目作为一个整体(每个提交)具有由SHA-1 id给出的唯一名称;通常前7-8个字符足以标识提交(您不能在分布式版本控制系统中使用简单的编号方案 – 这需要中央编号权限)。在CVS中具有指向项目状态的版本号或符号名称作为整体使用标签;在Git中也是这样,如果你想使用像’v1.5.6-rc2’的某些版本的项目…但在Git中的标签更容易使用。
>简单分支。 CVS中的分支在我看来是过于复杂,很难处理。你必须标记分支以具有整个存储库分支的名称(甚至在某些情况下,如果我记得正确,因为每个文件处理可能会失败)。添加到CVS没有合并跟踪的事实,所以你必须记住,或手动标记合并和分支点,并手动提供正确的信息“cvs update -j”合并分支,它使分支是不必要的使用。在Git中创建和合并分支很容易; Git记住所有需要的信息本身(所以合并一个分支就像“git merge branchname”一样简单)…它必须,因为分布式开发自然导致多个分支。

这意味着您可以使用主题分支,即在单独的功能部分中在多个步骤中开发单独的功能。
>重命名(和复制)跟踪。 CVS不支持文件重命名,手动重命名可能会破坏两个历史记录,或导致无法正确恢复项目状态的无效历史记录,然后重命名。 Git使用启发式重命名检测,基于内容和文件名的相似性(此解决方案在实践中运行良好)。您还可以请求检测文件的复制。这意味着:

>当检查指定的提交,你会得到一些文件被重命名的信息,
>合并正确地将重命名考虑在内(例如,如果文件仅在一个分支中重命名)
>“git blame”,(更好)等效于“cvs annotate”,一个工具来显示文件内容的逐行历史,可以跟随代码移动也跨越重命名

>二进制文件。 CVS对二进制文件(例如图像)的支持非常有限,要求用户在添加时(或以后使用“cvs admin”或通过包装器根据文件名自动标记)明确标记二进制文件,以避免二进制文件通过行尾转换和关键字扩展。 Git自动检测二进制文件基于内容以同样的方式CNU diff和其他工具做它;您可以使用gitattributes机制覆盖此检测。此外二进制文件是安全的防止不可恢复的修复感谢默认情况下’safecrlf'(事实上,你必须要求结束行转换,虽然这可能会打开默认情况下,根据分布),和(有限)关键字扩展是在Git中严格的“选择加入”。
>关键字扩展。与CVS(默认)相比,Git提供了非常有限的一组关键字。这是因为两个事实:Git的更改是每个存储库,而不是每个文件,Git避免修改没有更改时切换到其他分支或倒带到历史记录中的其他点的文件。如果你想嵌入版本号使用Git,你应该使用你的构建系统,例如。以下在Linux内核源代码和Git源代码中的GIT-VERSION-GEN脚本示例。
>修改提交。因为在分布式VCS中,如Git发布操作与创建提交是分开的,可以更改(编辑,重写)历史记录的未发布部分,而不会对其他用户造成不便。特别是如果你注意到提交消息中有打字错误(或其他错误)或提交错误,可以直接使用“git commit –amend”。这是不可能的(至少不是没有重的黑客)在CVS。
>更多工具。 Git提供了比CVS更多的工具。一个更重要的是“git bisect”,可以用来找到一个提交(修订),引入一个错误;如果你的提交是小的和自包含它应该是相当容易,然后发现错误在哪里。

如果您与至少一个其他开发人员协作,您会发现Git和CVS之间还存在以下差异:

>提交合并之前Git使用commit-before-merge而不是像CVS一样,merge-before-commit(或update-then-commit)。如果在编辑文件时,准备创建新提交(新修订),其他人在同一分支上创建了新提交,并且它现在在存储库中,则CVS强制您首先更新工作目录,并在允许您提交之前解决冲突。这不是Git的情况。您首先提交,在版本控制中保存您的状态,然后合并其他开发人员更改。你也可以要求其他开发者做合并和解决冲突。

如果你喜欢有线性历史和避免合并,你可以使用commit-merge-recommit工作流通过“git rebase”(和“git pull –rebase”),这是类似于CVS,你重放你的更改在顶部的更新状态。但你总是先提交。
>不需要中央存储库使用Git,不需要有单个中央位置提交更改。每个开发人员可以有自己的存储库(或更好的存储库:私有的,他/她做开发,公开裸露的一个,她/他发布那个部分准备好了),他们可以拉/从其他存储库,对称时尚。另一方面,大型项目通常有社会定义/指定的中央存储库,每个人都从中获取更改。

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

> lurker。如果您只想获取项目的最新更改,(不传播您的更改)或进行私有开发(不贡献回原始项目);或者使用外国项目作为您自己项目的基础(更改是本地的,发布它们没有意义)。

Git支持匿名未经验证的只读访问通过自定义高效的git://协议,或者如果你在防火墙阻止DEFAULT_GIT_PORT(9418),你可以使用纯HTTP。

对于CVS,对于只读访问,最常见的解决方案(如我理解的)是CVS_AUTH_PORT(2401)上的“pserver”协议的客户帐户,通常称为“匿名”并具有空密码。默认情况下,凭据存储在$ HOME / .cvspass文件中,因此您只需提供一次;仍然,这是一个障碍(你必须知道客人帐户的名称,或注意CVS服务器消息)和烦恼。
>边缘开发者(叶贡献者)。在OSS中传播更改的一种方法是通过电子邮件发送修补程序。这是最常见的解决方案,如果你(或多或少)意外的开发人员,发送单一的更改或单个bug修复。 BTW。发送补丁可能通过审查委员会(补丁审查系统)或类似手段,不仅通过电子邮件。

Git在这里提供了在传播(发布)机制(对于发送者(客户机)和维护者(服务器))中有帮助的工具。对于想通过电子邮件发送更改的人,可以使用“git rebase”(或“git pull –rebase”)工具在当前上游版本之上重放自己的更改,因此您的更改位于当前版本之上(是新的) ,和“git format-patch”创建带有提交消息(和作者)的电子邮件,改变(扩展)统一差异格式的形式(加上diffstat以便于审查)。维护者可以使用“git am”将这样的电子邮件直接转为提交保留所有信息(包括提交消息)。

CVS不提供这样的工具:您可以使用“cvs diff”/“cvs rdiff”来生成更改,并使用GNU补丁来应用更改,但据我所知,没有办法自动应用提交消息。 CVS旨在用于客户端中。服务器时尚…
>中尉。如果您是项目(子系统)的单独部分的维护者,或者您的项目的开发遵循Linux内核开发中使用的“信任网络”工作流程,或者如果您有自己的公共存储库,想要发布太大,通过电子邮件发送作为补丁系列,可以发送pull请求到(主)项目的维护者。

这是针对分布式版本控制系统的解决方案,因此CVS当然不支持这种协作方式。甚至有一个工具叫“git请求拉”,帮助准备电子邮件发送到维护者请求从您的存储库。感谢“git bundle”,你可以使用这种机制,即使没有公共存储库,通过发送电子邮件或sneakernet的更改包。一些Git托管网站(如GitHub)支持通知某人在您的项目上工作(发布一些工作)(前提是他/她使用相同的Git托管网站),并支持一种拉取请求。
>主开发者,即直接发布他/她的更改(到主/规范存储库)的人。这个类别对于分布式版本控制系统更广泛,因为具有对中央存储库的写访问的多个开发人员不仅是可能的工作流(您可以有单个维护者将更改推送到规范存储库,一组中尉/子系统维护者以及广泛的叶片开发者,他们通过邮件将修补程序发送到维护者/项目邮件列表,或者发送给副官/子项目人员之一)。

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

使用CVS,可以在自定义未加密(纯文本)pserver协议或使用远程shell(您真正应使用SSH)发布更改之间进行选择,对于集中式版本控制系统,意味着提交更改(创建提交)。嗯,你也可以使用SSH隧道’pserver’协议,并有党工具自动化这个…但我不认为这是那么容易,例如。糖尿病。

一般来说,分布式版本控制系统(如Git)提供了更广泛的可能工作流选择。使用集中式版本控制系统(如CVS),必须要区分具有提交访问存储库的人员,而没有…的用户和CVS不提供任何工具来帮助接受来自人员的提交(通过补丁)提交访问。

Karl Fogel在Producing Open Source Software的版本控制部分指出,最好不要对可以对公共存储库进行更改的区域提供过于严格,严格和严格的控制;依靠(为此)社会限制(如代码审查)比技术限制更好;分布式版本控制系统减少IMHO甚至进一步…

HTH(希望有帮助)

http://stackoverflow.com/questions/802573/difference-between-git-and-cvs

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:GIT和CVS之间的区别