最近团队项目准备从svn往git迁,于是做了一些相关的了解,发现svn跟git还是有很多不一样的,下面写了一些个人理解。
这是两者最根本也是最核心的区别,如果理解了这个区别,就会很容易理解其他比如下面说道工作流程等的不同。为了方便理解,这里举个不太恰当的比喻,svn中本地和远程的关系相当于我们浏览器打开网站和该网站的服务器的之间的关系,我们本地只是状态,而我们要提交修改或切换页面都是通过与服务交互进行的。而git中本地和远程的关系相当于两台服务器之间的关系,两者都能独立完成操作,两者之间需要的只是同步。下图为git和svn本地和远程之间关系的示例图:
理解了上面的原理上的不同,就可以理解工作流程的不同了,svn是本地修改,远程提交,而git则是本地操作,远程同步,这里的操作包括修改,提交,分支操作等。
svn更倾向于GUI工具的使用,而git更倾向于命令行工具的使用,当然这两者也不是完全是死的,比如你觉得git命令行不直观的话,也可以使用一些GUI工具,比如windows上安装的git本身自带GUI工具,甚至还有丧心病狂的 TortoiseGit 工具。
很多刚从svn迁到git的同学会很困惑,为什么每次commit之前都要add一下。事实上,在git后续的版本就增加了 git stage
命令,其作用跟之前版本的 git add
完全一样,就是官方为了强调, git add
的作用是将修改的文件加到暂存区(stage),而 git commit
的时候只会提交在暂存区的修改,也就是说,暂存区就是本地修改和commit之间的缓冲,而这样做的好处按我的理解有2个:
git add
是可以方便我们进行代码review的,每次我完成一部份相对完整或者独立的修改之后,我会reviwe完修改之后就执行 git add
,将这部分修改加入缓存区,而当我后面又做了一些修改要review的时候,我就可以只关心修改了但未add的文件。不然的话,要么每次commit的文件都很多,要么commit次数很多,很乱。 PS: 当然,如果你觉得上面说的东西都没卵用,那么可使用 git commit -a -m
命令直接实现 git add .
+ git commit -m
的效果(注意当有文件增删的时候不行,还是要先add一下)
svn上checkout跟git的checkout是不同的,git上与svn checkout对应的命令是 clone,而git上checkout的作用分支切换或者代码还原。