无版本控制的史前时代
在学校,我大部分情况是自己一个人写点东西,不需要与别人合作,每次都是写到哪里下次打开电脑继续写。但这样会有一些问题,突然有一天我的电脑出故障了如果没有及时备份就悲剧了。对之前的工作做了一些修改发现还不如以前,想改回去,又悲剧了,遇到这种情况只能提前备份了。那个时候我不知道版本控制为何物。处在无版本控制的史前时代。
集中式版本控制系统svn
我最早接触的版本控制系统是svn,是在学校的软件开发课上老师介绍的。对于还不知道版本控制系统为何物的我乍一听,这个工具好啊,大家以后就可以在各自的电脑上开发,环境一致,及时更新合并,不会相互影响,也省去了合并代码的种种问题。所以我从无版本控制系统的史前时代来到了集中式版本控制系统时代。
刚开始使用svn我觉得很方便,可渐渐地就遇到一些问题,代码文件十分大,下载代码真的是用了好久。关键是有一次我犯了大错,修改完代码后忘记更新最新代码便提交了,在此同时刚好别人也更新同一文件。然后悲剧就发生了,我提交上去的代码在服务器上冲突了。这一冲突,所有人更新下来的代码都是服务器上那个冲突版本,影响了别人的工作。可如何解决呢,这时就得一个人先在本地把冲突解决掉,而且这期间不能有人再提交修改这一文件。然后将解决冲突后的文件提交到服务器上。这时大家更新才得以继续正常工作。还好后果不是很严重。对于这种问题就是要养成提交之前先更新的好习惯去避免它。但也难免有时会手抖点错...
分布式版本控制系统Git
后来,去公司实习,我邂逅了Git。怎么说Git呢,刚开始使用,只是觉得和svn并没有太多区别,都是一样的更新提交。只是Git用命令行感觉效率更高一些。后来相处时间长了,才渐渐发现它的好。
说到学习Git,我强力推荐廖雪峰老师的Git教程。可谓深入浅出,对于初学者简单易懂。戳这里>>>
- 网络环境要求低
首先在本地对Git进行操作很方便,不用联网就可以,只有在pull,push
的时候需要网络。 - 冲突解决更智能
其次,对于代码冲突的情况。并不会影响到别人,首先当你提交一段代码或者合并分支的时候,如果发生冲突是提交不上去的,它会在本地产生冲突,然后当你解决后再把它add, commit
将解决冲突后的代码提交上去,在这期间别人仍旧可以照常工作。 - 随时撤销很方便
有一次,我们需要和另一个开发团队合并代码,虽然是两个不同的项目,但其中有一些共用部分。所以将部分项目文件进行了合并,合并完成后并不是期待的结果,由于项目一中一些文件影响了项目二,我们试图将部分文件恢复到合并前,但不影响其他文件的合并结果。这时git checkout -- file
就大显身手了,并不需要回退整个操作,只需要回退部分文件即可。 - 版本回退时光机
其实即使提交了代码依然可以回退,并且不只是回退到上一个版本,git log
查看日志,只需知道id
号,就可以回退到任意你想回退的版本。git reset --hard "commit id"
这样,再遇到以前那样改了之后又想改回去就不用打动干戈了,一行命令就搞定了。 - 随机应变能力强
某天我正在完成任务一,这时测试提了一个紧急bug需要先改。但我的任务一尚未写完还不能add
并提交。但又要将现场保护起来。这种情况一个命令就可以解决了git stash
将现场暂时储藏,原理就是押入栈中。接着创建一个新分支解决bug,完事之后使用命令git stash pop
恢复现场,继续工作。就是这么方便。
更重要的是,因为Git有GitHub这样一个网站,托管了太多开源项目,让我们可以很方便的学习别人的源码。
未来不知道随着coding monkeys的需求会不会有更强大的版本控制系统?但至少现在Git是最强大的版本控制工具,没有之一。