仅记录工作中碰到的一些问题。
Git和SVN区别
1.Git是分布式,SVN是集中式
GIT跟SVN一样有自己的集中式版本库或服务器。但GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看历史版本记录,创建项目分支等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。
Git中央服务器的目的:为了方便“交换”大家的修改,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但没有它大家也一样干活,只是交换修改不方便而已。
分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
2.GIT把内容按元数据方式存储,而SVN是按文件
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
3.GIT的内容完整性要优于SVN
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
4.Git直接记录快照,而非差异比较
Git和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。Git并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git不会再次保存,而只对上次保存的快照作一链接。
5.GIT分支和SVN的分支不同
分支在SVN中一点不特别,就是版本库中的另外的一个目录。 处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。
上面的区别貌似说的都是SVN的不足,其实一个工具的优劣要放到特定场景里去评价,用他去做他合适的事情
。
从公司角度而言,SVN具有如下优势
- 安全机制:服务器公司统一控制管理,不会每个人都拷贝一份, 可以对组员限制, 也可以分配不同组,不同于Git,clone之后所有的代码和历史都泄露了
- 权限管理:svn有细致的按照目录级的权限控制
基本操作
- 某文件a先更新为服务器版本,然后自己修改过文件,然后update,此时并不会将文件换成服务器的,自己修改的内容依旧存在。
- 某文件a先更新,服务器文件被人修改并提交过,自己也修改过此文件,此时update,会出现冲突(conflict)或者自动合并(merge)。
- 某文件a先更新,服务器文件被人修改并提交过,自己也修改过此文件,此时commit,会提示必须先update在commit。
- Revert会将文件还原成你未修改之前的本地最近一次update的版本,此时再update才是服务器的最新版本。
- Show log,branch/merge,add,diff。
- resolved:运行svn resolved让你的工作拷贝知道你已经完成了所有事情。你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。
主线、分支、标记
新建资源仓库时,可选择默认创建三个文件夹。这三个文件夹分别是【trunk】【branches】【tags】
Trunk
一般用于存放目前项目主线,也就是项目所有功能模块的集合体,一整个项目所有代码库。一般来说,存放在trunk中的代码都是稳定可正常运行的。
Branches
分支,其实也就是主线的拷贝,主要应用于在项目需要有新的开发时,不针对主线进行,而是在主线的基础上,拷贝一份或者多份。针对每个模块小组,均可根据自己的开发情况,创建自己的分支进行开发,最后将分支一起合并到trunk上来,从而最后合并为一个项目。
分支存在的意义就在于保证主线稳定版代码和新需求开发版代码的间的独立。目前在svn的使用上,最大的问题就是没有建立各自项目组的分支,所有模块均集中对trunk中主线进行操作。就像测试时直接操作生产数据库一样可怕
,因为木有备份,出问题了恢复就比较麻烦。
那么如何创建分支呢?
- 选择trunk中需要创建分支的主线文件夹,右击如下,选择Branch/tag
- 选择分支创建路径,一般到branches下,版本号选择有(最新版本、具体版本、working copy)
- 分支创建完毕,then新功能的开发便可重新定位到分支URL进行代码的更新提交而不对主线造成任何改动
- 可通过版本分支图查看各个版本分支记录,定位分支从哪一版本分出去的,当前只做了一个分支
如何将分支合并到主线?
- 右击需要合并的文件,选择merge
- 选择合并的类型
- merge a range of revisions:将trunk的哪个版本所做的变化合并到branch中,可以是某一连串的revision,比如 4-7,15-HEAD,也可以是某个单独的某版本号。适用于新功能开发即有在分支中进行,又有在主线中进行,将某个分支或主线上提交的多个版本间的变化合并到另外一个分支上。
- Reintegrate a branch: 适用于在分支中开发新功能,分支开发结束后将所有的改动合并回主线上。
- Merge two different trees:合并两个不同分支
Tags
标记是主线中一个特定版本的定型版。比如一个系统1.0开发完成,就会将主线的代码打一个tag,标记1.0开发完成。所以Tags中的代码只读的,也就是tags中的版本是不允许再动了。
那么如何创建tag呢?
- 创建tag和分支的流程完全一致,唯一不同的便是填写不同的URL路径
敬业的刷单小能手又来了~