实时搜索: git与svn哪个好用

git与svn哪个好用

547条评论 5332人喜欢 5418次阅读 364人点赞
...

git和svn哪个好: GIT是分布式的,SVN不是:
这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。如果你能理解这个概念,那么你就已经上手一半了。需要做一点声明,GIT并不是目前第一个或唯一的分布式版本控制系统。还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。但GIT在这方面做的更好,而且有更多强大的功能特征。
GIT跟SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提 交文件,查看历史版本记录,创建项目分支,等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。
同样,这种分布式的操作模式对于开源软件社区的开发来说也是个巨大的恩赐,你不必再像以前那样做出补丁包,通过email方式发送出去,你只需要创建一个分支,向项目团队发送一个推请求。这能让你的代码保持最新,而且不会在传输过程中丢失。GitHub.com就是一个这样的优秀案例。
有些谣言传出来说subversion将来的版本也会基于分布式模式。但至少目前还看不出来。
GIT把内容按元数据方式存储,而SVN是按文件:
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它 们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
GIT分支和SVN的分支不同:
分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。感谢Ben同学指出这个特征。所以,经常会发生有些分支被遗漏的情况。
然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
GIT没有一个全局的版本号,而SVN有:
目前为止这是跟SVN相比GIT缺少的最大的一个特征。你也知道,SVN的版本号实际是任何一个相应时间的源代码快照。我认为它是从CVS进化到 SVN的最大的一个突破。因为GIT和SVN从概念上就不同,我不知道GIT里是什么特征与之对应。如果你有任何的线索,请在评论里奉献出来与大家共享。
更新:有些读者指出,我们可以使用GIT的SHA-1来唯一的标识一个代码快照。这个并不能完全的代替SVN里容易阅读的数字版本号。但,用途应该是相同的。
GIT的内容完整性要优于SVN:
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。这里有一个很好的关于GIT内容完整性的讨论 – http://stackoverflow.com/questions/964331/git-file-integrity
GIT和SVN之间只有这五处不同吗?当然不是。我想这5个只是“最基本的”和“最吸引人”的,我只想到这5点。如果你发现有比这5点更有趣的,请共享出来,欢迎。

如何通过插件来进行svn和Git间的无缝连接,并进行定时自动同步: 楼主想在服务器上做这个事情吗?正好我也用到了……我是用git svn clone一个工作目录做中转,然后定时来做。应该也可以用hook。

git-svn clone不下svn远程库,怎么回事,求大神解答: 我也遇着 一模一样的问题。。怎么解决啊~~

idea代码提交时怎么老是有commit message: 在某些提交代码的时候,我们写的提交信息或者不完整,或者不准确,还有时候是因为懒,随便写了点乱七八糟的
这种情况对项目的管理和以后问题的复查都是很大的阻碍
所以,就需要可以更改svn的commit message,将已提交的信息改为合适的准确的信息
在idea中可以这样干
右键 -> Subversion -> Show History
在打开的history的tab中,右键你要修改的一条log
Edit Revision Comment
这样就可以修改了

怎么使用Git像svn一样: 里不起作用。不过我已经习惯了点击commit来查看所有修改的文件,这个比文件夹的icon高效多了。因为如果你有很多文件,文件夹又有很多层,去找到修改的文件很麻烦

为什么说 Git 比 SVN 更好: 这是要看情况的,各有特色。Git是分布式的,SVN是集中式的,两个概念不同。Git非常适合个人开发,可以本地建仓库,控制版本。而SVN需要有至少一台中央服务器,只有在联网状态下才能够进行版本管理。企业中通常都会选择SVN,因为这样方便集中管理代码,更安全。
上述是网上的理解,我个人理解觉得git更适合做开源的东西,更方便分享,svn操作简单,毕竟已经技术很成熟了。

Git和SVN,代码管理哪个更好:

代码版本管理系统的历史

代码版本管理系统大致可以分为三个时代:

第一代:本地式

这代主要的特点提供本地代码版本控制,比如SCCS(1972)、 PVCS(1985)等。

这代主要实现了基本的代码版本管理,但缺点是无法让多人同时对一个版本库进行修改。这个也和当时软件规模不够大有关,也没有这样的需求。

第二代:客户端-服务器式

这代主要的特点是提供集中式服务器端代码版本控制,比如 CVS(1986), ClearCase(1992), Visual SourceSafe(1994), Perforce(1995), Subversion(2000) 等。

这代主要是实现了中心服务器端的代码版本管理,特点是可以让多人同时对一个代码版本库进行同步和修改,但缺点也相当明显:

在无法连接服务器的情况下,无法查看日志以及提交和比较代码版本(慢速网络和远程异地工作的程序员的痛),以及当服务或者网络出现问题的时候很多人员就会无法工作。

不支持local branch,导致branch创建管理复杂,并且一旦创建就很难修改(快速迭代开发中的程序员的痛)

由于只有一个中心端服务器,一旦发生灾难性问题,那么所有日志都会丢失,所以需要经常做备份(备份需要不小的成本)

如果软件代码量过于庞大,一般会出现速度缓慢的情况,因为每次的日志查询、不同版本之间的代码比较和代码提交等操作都需要和服务器通信,造成服务器端的负载过大。

第三代:分布式

这代主要的特点是提供分布式代码版本控制,比如Git(2005), Mercurial(2005)等。

这代结合了第一代和第二代的优点并实现了分布式的代码版本管理。

这代的优点:分布式管理,在没有和服务器有连接的情况下仍然可以查看日志,提交代码,创建分支;支持local branch,可以快速方便的实现各种分支管理;支持分布式,从而可以实现分块管理,以及负载分流管理。

缺点是有一定的学习曲线,比如分布方式下的代码同步,local branch的理解与运用,分布式代码管理的理解与运用等。详细的比较可以参考:这里。

二、大型分布式团队

曾经有这样一个分布式团队,他们在多个城市都有小分队,并且正在开发一个大型项目,见下图



他们使用的代码版本管理工具是第二代代码管理工具SVN,管理方案如下:



但是他们在使用的过程中却遇到了下面这些问题与痛点。

由于是分布式团队,所以:

基于团队的代码模块分离困难

当服务器不可用时:

不能查看提交记录

不能比较文件

不能提交代码

创建代码分支时:

分支创建速度慢

多分支管理困难

在提交代码时:

希望有Code Review

希望有CI Review

因为代码庞大:

查看日志慢

备份代码库的时候:

需要停机备份

备份成本高

针对以上问题,可以使用新一代的分布式的代码版本管理系统来解决,见下图:



其中每一个团队都有自己独立的代码库,有一个中心库用于同步这些独立的代码库,并且每个库都由团队自己管理和维护。而且代码版本管理系统需要支持轻量分支,代码评审,离线提交,离线查看日志等功能。

但是由于当前没有一个单一的代码版本管理工具能同时满足以上所有需求,所以很多公司都基于它们开发集成管理系统,比如Gerrit,GitLab,GitHub,BitBucket等。其中的Gerrit由于其开源,免费,以及由Google开发和维护,并管理着Android,OpenStack等大型项目源代码的特点,成为了大型分布式团队优先选择的系统。

三、Gerrit

Gerrit是由Google开发的,用于管理Google Android项目源代码的一个系统。它是基于Java和Prolog等开发的,支持Git,权限管理,代码评审等综合的一个管理系统。它与GitLab和GitHub最大的不同是它隐藏了代码分库管理的细节,使得开发人员不需要进行fork这样的手工分库和同步操作就可以进行代码开发和提交,节省了开发人员的时间,见下图。



由于Android本身是一个开源项目,所以贡献者非常多,开发团队也遍布多个地方(存在时差),导致“如何保证代码质量”成为一个很大的问题。为此Google在Gerrit中加入了功能强大并且十分严格的代码评审系统。

首先当代码提交以后并不会直接merge到中心库里面,它会暂时存在一个临时库里面,同时生成一个代码评审记录,并向特定的评审人员发送请求评审的邮件。当评审者在评审代码之后,如果通过就需要在Gerrit系统里面对代码进行打分,如果通过了就可以将代码merge到中心库里面去,如果没有通过,那么这个代码提交就需要被返还给开发者进行修改。

与此同时它还可以自动触发一次包含本次代码提交的CI构建(前提需要手工预先配置),如果CI自动构建和测试通过,也可以自动在Gerrit系统里面进行打分,可以给最终进行merge的人员进行参考。示意流程见下图。


由于Android源代码由上百个独立的代码库组成,并且编译一个Android系统需要大部分代码库里面的代码,所以如何管理如此多的代码库也是一个难题,比如如何一次性同步需要编译一个需要支持特定设备的代码库组合。为此Google基于Python语言开发一个工具叫Repo ,这个工具可以自定义你需要的代码库的组合,并且一次性对这些代码库进行同步,比如pull和push,见下图。



四、SVN到Git的迁移

对于想从集中式代码管理系统迁移到分布式代码管理系统的团队来讲,如果团队规模小,那么问题一般都不大,但是对于大型分布式团队却是困难重重。最主要的两个困难:

代码量太大,很难一次性将所有的代码和日志等在短时间内迁移成功。

由于下属团队太多,很难同一时间让所有团队都切换至新的代码管理工具。

为了解决这些难题,一般都会首先选用1个团队来使用新的代码版本管理工具。如果这个团队转换成功,再将其作为标杆向其他团队推广,从而逐步的将所有团队切换到新的工具上去。

SVN到Git的迁移方案一般主要会使用两种工具:

开源免费的git-svn;

商业收费的Subgit。

其中使用Subgit的迁移方案如下图:



如果团队组资源充足,还可以使用Gerrit搭建一个独立的Git服务器,从而以分布式的方式进行代码迁移,如下图:



五、多产品线的管理

使用同一个中心代码库管理多产品线一直是大型项目的一个困难点,特别是使用SVN这样的工具更是难以管理,因为SVN这种工具的Branch本质上是一个目录拷贝,并且速度慢,而且代码回迁也需要手动进行。但是如果使用Git的特性来管理多产品线,比起SVN是事半功倍。具体方案见下图:



总结:

分布式代码版本管理系统并不一定适合所有团队,比如中小团队可能更关心的只是成本更低,简单易用,那么SVN等这类集中式版本管理工具还是更为适合。但是不管团队最终选用什么代码版本管理工具,只要适合自己的团队的开发流程和工作方式,并且代码管理顺畅就可以了。

svn和git分支管理策略的区别: 区别很大,差距也很大,Git在这方面完胜SVN
git分支切换可以在瞬间完成,底层实现也就是一个指针。
而SVN的分支切换,你会发现,它会慢吞吞地从服务器拉取这个分支的代码,所以很慢。

  • 17岁怎样让胸变大

    iPad上有什么离线免费学英语的软件: 新概念英语,听歌学英语,英语流利说,忆术家,金山记单词,100天学会英语。 ...

    628条评论 1555人喜欢 4407次阅读 487人点赞
  • mk在澳门哪里有专柜

    我捡到了一个苹果爱拍怎么解锁: USB连接电脑 然后百度搜索一下 用个软件大事就行 ...

    250条评论 3417人喜欢 5056次阅读 949人点赞
  • .pe是哪个国家

    在ipad上面有什么好用的视频编辑软件可以调整影片播放速度?: 只知道有个很好玩的iphone app 叫silent film director 可以把视频编辑成卓别林老电影状的快速播放不过这个是娱乐app...视频效果都是按预置的几种老电影形式来渲染的 ...

    851条评论 3218人喜欢 1477次阅读 971人点赞
  • 2016年缴款后多久上市

    ipad9.3.2怎么完美越狱: 你去威锋网看看现在只有9.0.1-9.3.3的半完美越狱,只要重启就要重新点击越狱。完美越狱的还没有 ...

    350条评论 4051人喜欢 6158次阅读 642人点赞
  • dnf新职业什么时候出

    ipad mini1可以升级这个系统吗: 你这个最好是不要升级了,IPadmimi1平板的内存是512M的,最流畅是iOS7系统,最高只能刷到iOS8系统,虽然也可以流畅但是流畅性比不上iOS7的,我自己用的是IPad mimi2,系统也是最高的iOS12....

    395条评论 2058人喜欢 2811次阅读 292人点赞