git与svn的区别简介【git进阶】

    之前有篇文件专门讲解了git基本命令的用法(git使用手册,有这些就够了^_^),以及git代码合并、代码冲突解决方法与代码推向远端的操作,但是对于一些有SVN使用经验或使用习惯的同仁来说,仿佛天方夜谭,因为相比于SVN的线性提交与TortoiseSVN配合简易的操作,根本用不到命令行去操作,也不必记那么多的命令,是的,在Windows下SVN确实比git好用一些,但是作为一名有追求的程序员,不应该将你的开发技能受限于某单一操作系统(Windows),相较于Linux、Unix以及MacOSX等类Unix系统来说,git无疑是最好的选择,不仅仅如此,在多分支管理、代码Review、冲突处理与代码检视等方面,git也发挥着比SVN更强大的优势,这篇文章就结合小编本身多年的git与SVN使用经验,总结出其主要的区别,方便SVN使用者在转向git使用时,能更好的运用既有的理念,更好更快的上手git。

一、git与SVN切代码的区别
    将远端代码拉取到本地,习惯用“切代码”,还是比较贴切的,因为远端的代码仓库可能时刻都会有人向其上提交合并代码,我们下载代码到本地,只是下载某个时间点之前的最新代码,其后的代码如果我们没有主动更新到本地的话,本地是没有的,相当于基于某个点,将仓库中的代码切断,放到本地,所以会用“切代码”来形容。
    git在切代码时,首先需要将git的仓库克隆到本地,用git clone xxx.git命令,git能在多种协议下使用,所以Git URL可能以ssh://, http(s)://, git://开头,默认情况下,这样切的代码为仓库中的master分支代码,也就是git的主分支的代码,如果直接想切某个仓库分支的代码,则克隆是需要加上-b参数,如git clone -b 分支名仓库地址,这样就直接切下指定分支的代码了。切完代码后,我们可以用git branch来查看本地的分支名,如果本地有多个git分支,则用git branch查看后,带星号(*)的为当前分支,如下图所示,本地有两个分支:master和develop分支
git与svn的区别简介【git进阶】_第1张图片
如果想查看本地和远端仓库的所有分支,也可以用git branch -a命令,如下图所示:
git与svn的区别简介【git进阶】_第2张图片
学习git,大家心里一定要有分支的概念,git使用者往往会在各个分支之间切来切去,大家不要搞晕了^_^.
还有几点需要着重说明一下:1.git本地会有数据库来记录不同分支之间的差分,所以在不同分支之间切换时,本地的代码也会跟着变换为相应分支的代码。2.如果本地代码有修改,则必须commit之后才能进行分支切换,否则切换不过去的(这也证明了第一点,如果代码没有commit,数据库中是没有记录差分的,来回切换可能导致你的修改丢失,git为了防止这种情况,所以不允许本地有改变的情况下切换分支)。

    关于创建新分支操作,请参见前篇文章:

git使用手册,有这些就够了^_^

    SVN的切代码,相信大家一定不陌生,直接用TortoiseSVN右键,checkout就可以将远端下载到本地,详细的就不做具体介绍,但是要特别注意一点:SVN的checkout和git的checkout命令是两个完全不同的操作,git的checkout是转换分支用的,可以将本地的其他分支切换到当前分支,例如当前分支为master,如果用git checkout develop,则当前分支变为了develop,可以用git branch命令验证。

二、git与SVN代码提交远端时的区别
    这里,大家需要知道git与SVN的另一个巨大的区别,那就是git支持离线commit代码,而SVN不支持,SVN在commit代码时,必须与仓库是网络相通的,否则是提交不成功的,而git只需要在向远端push是和仓库网络相通就可以了,其他时刻,本地操作都基本可以不与仓库网络相通。这里大家不好理解,我可以举个例子:假如现在有两个功能需要你去开发,不巧的是此时网络出现问题,本地与仓库网络不相通了,如果用SVN开发,那么当你开发完第一个功能后,此时你需要commit提交该功能的代码,但是由于网络不通,因此你必须等待网络通了后,提交完这部分代码,然后才能继续开发第二个功能,这中间就浪费了很多时间(当然,你也可以将两个功能的代码开发在一块,然后等网通了后一股脑提交到远端,但是有追求的程序员是不会这么干的,这么做一来在看log查问题时不好找,二来如果有代码review的人,在review代码时,功能耦合性高,增加一定的复杂性,而且好多公司要求单功能提交代码,不允许多个功能一次性提交的,建议大家按功能提交代码,并写好提交log,为人为己都方便^_^);但是假如你用的是git,情况就会不一样,当你开发完第一个功能后,你大可放心的commit提交代码,然后继续开发第二个功能,完了后继续commit代码,开发完两个功能并commit后,可以查看提交log,用命令git log -l 5查看近5次的提交记录,能开到两个功能的提交记录,等网通了之后,用git的push命令,将这两个功能的提交推向远端,这样就在无网的情况的单功能提交了两个不同的功能代码。
    由此可见,git在本地对代码的修改与commit是有单独记录的,所以,大家在预研开发与测试开发时,可以大胆的进行代码的commit,将开发的不同功能分开,且不会对远端仓库造成影响。
    在提交代码时,如果远端已经有人提交过代码(也就是本地代码不是最新的),则SVN会在提交时弹出个dialog让用户点击更新,如果有冲突得先处理完冲突,然后才能提交到远端仓库;而git则有各种各样的方法来完成更新并提交代码,这里简单介绍两种:1. git自动合并法,也就是在向远端推代码前,先进行pull更新,此时,如果远端有人已经提交过代码,则git会根据远端提交时间与本地提交时间(本地commit的时间,非push的时间)排序,并自动合并在此之间变化文件的版本更新,并单独作为一次提交,这就是为什么如果我们直接将本地代码push到远端时,查看提交log偶尔会出现一版类似Merge xxxxx to xxxxx的提交,但是这种方法在出现冲突时比较难处理,而且代码的提交log不利于复查与提交跟踪,所以自动的东西总不是那么理想。 2. 变基法,这种方法是当我们pull代码后,发现本地代码不是最新的了(本地代码落后于远端),此时可以找到远端最新一版提交的提交码(一串哈希值),然后用命令git rebase xxx将本地的代码拉到最新,然后提交,这样自动生成的那版类似Merge xxxxx to xxxxx的提交就会自动消失。 3. 使用cherry-pick方法,该方法也是我一直在用和推荐的方法,具体使用如下:在开发前将本地开发分支代码拉取到最新,然后基于该最新代码,在本地创建一个临时分支,并切换到该临时分支上,然后在该分支上开发,开发完成后正常commit,并记住此次提交commit的提交码(哈希码),此时,将本地分支切换到开发分支上,并再次更新开发分支,防止远端有人提交过代码,然后通过cherry-pick后面跟哈希码,将临时分支提交的那版代码合到开发分支上(注:git其实是根据差分合并的),然后向远端push本地的开发分支。以上冲突的处理,可参见前篇git的相关文章。

三、git与SVN更新代码的区别
    git更新代码用的命令是git pull,也可以用git fetch命令,这两个命令的区别在于拉取到的远端代码是否与本地代码进行merge,在分支管理开发中,大部分都用git pull更新要合并的分支,然后将已经开发的分支上要合并的代码cherry-pick过来,或用其他方法进行修改到合并分支上,然后提交到远端,git功能比较强大,这个根据个人经验与喜好进行操作。
    SVN更新代码直接用Update进行更新,这里不做多说,相信大家都知道。

四、git与SVN代码提交标识的区别
    git每提交一版代码,都会生成一串唯一标识该版提交的哈希码字符串,该字符串唯一标识了在该git仓库中的一次提交。
    SVN的每一次提交,都是一次整型的累加,比如最新一版提交是#12345,则下一版提交就是#12346,以此类推。
    用TortoiseGit和TortoiseSVN可以查看提交历史,我们可以发现,SVN是线性的,而git可以更明显的看出其非线性视图。

五、git与SVN的更多区别,以及更多git的高级用法,后续......


总结:该篇文章主要介绍了git与SVN的一些基本的区别,更主要的介绍了git的一些详细用法,希望对大家有帮助,也希望各位同仁共同学习,共同探讨,相互进步^_^.

我的公众号,欢迎关注交流学习进步

git与svn的区别简介【git进阶】_第3张图片

你可能感兴趣的:(git,svn,代码管理,git分支管理,git使用)