前言
学习使我快乐
一。git与github关系
git是一个版本控制工具
github是一个用git做版本控制的项目托管平台。
二。git与svn的区别
Git是由著名Linux内核(Kernel)开发者LinusTorvalds为了便利维护linux而开发的。
git是一个分布式的版本控制系统。作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
1. Git是分布式的,SVN不是,SVN是集中式:分布式模式,就是每个开发人员从中心版本库/服务器上check out代码后会在自己的机器上克隆一个自己的版本库
2.SVN的工作区和版本库是截然分开的,而Git的工作区和版本库是如影随形的:SVN的版本库和工作区是存储在不同的路径下,一般是在不同的主机中。
3.Git把内容按元数据方式存储,而svn是按文件:.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上的所有的东西,例如标签、分支、版本记录等。
4.版本号:Git没有一个全局的版本号,而SVN有。SVN每一次提交都具有整个版本库全局唯一的版本号。Git的版本号则更进一步,版本号是全球唯一的。SVN的版本号是连续的版本号,每一次新的提交都会版本号+1. Git对于每一次提交,通过对文件的内容或目录的结构计算出一个SHA-1哈希值,得到一个40位的十六进制字符串,Git将此字符串作为版本号。
5.Git的内容完整性要优于SVN:Git的内容存储使用的是SHA-1哈希算法,这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
6.版本库(repository):SVN只能有一个指定中央版本库,当这个中央版本库有问题时,所有工作成员都一起瘫痪直到版本库维修完毕或者新的版本库设立完成。而Git可以有无限个版本库,或者每一个Git都是一个版本库,区别是它们是否拥有活动目录。
7.系统档案:SVN会在每一个目录放一个.svn,如果想移除这些.svn是很累的(最新版本的svn只有在根目录有.svn,子目录没有了)。而Git会在目录起点拥有一个.git目录。
8.重新设立起点(rebase):在Git,如果你想把别人的最新提交设立为现在这个分支的起点,只要执行git rebase branch_name即可。这个和合并(merge)不同的是,merge会依据修改的时间视为最新,而rebase会要求你去解决双方都有修改过的地方的矛盾(confict).
9.Git是压缩后传输,svn是一个一个文件传输,所以git的网络流量比svn少很多。
10.部分检出(checkout):SVN可以将整个库检出到工作区,也可以将某个目录检出到工作区。但是Git只能全部检出,不支持按照目录进行的部分检出。在SVN中,从仓库checkout的一个工作树,每个子目录下都维护着自己的.svn目录,记录着该目录中文件的修改情况以及和服务器端仓库的对应关系。Git没有部分检出,这并不是说只有将整个库克隆下来才能查看文件。
11.更新:在SVN中,因为只有一个中心仓库,所以所谓的远程更新,也就是svn update,通过此命令来使工作区和版本库保持同步。Git使用git fetch和git pull来完成远程更新任务。fetch操作只是将远程数据库的object拷贝到本地,然后更新remotes head的refs,git pull的操作则是在git fetch的基础上对当前分支外加merge操作。
12.提交(commit):在SVN,当你提交你的代码时,它将直接记录到中央版本库。当你发现你的代码存在严重问题时,你已经无法阻止事情的发生。如果网络中断,你根本没办法提交。对于SVN来说,所有的commit操作都可以认为是对远程仓库的更新动作。在工作区中对文件进行添加(add)、修改、删除(delete)操作要同步到版本库,必须使用commit命令。而Git的提交完全属于本地版本库的活动。而你只需”推”(git push)到主要版本库即可。Git的”推”其实是在执行”同步”(Sync)。在Git中,要将一个文件纳入版本管理的范畴,首先是要用git add将文件纳入stage(暂存区域,介于workcopy和版本库head版本的一种中间状态)的监控范围,只有更新到stage中的内容才会在commit的时候被提交。Git的stage让你在提交的时候清楚的知道git将要提交哪些改动。
13.分支(branch):在SVN,分支是一个完整的目录,且这个目录拥有完整的实际文件。而Git,每个工作成员可以任意在自己的本地版本库开启无线个分支。Git的分支相当简单,你可以从同一个工作目录下快速的在几个分支间切换,很容易发现未被合并的分支,能简单而快捷的合并这些文件。Git中的分支实际上仅是一个包含所指对象校验和(40个字符长度SHA-1哈希值)的文件,新建一个分支就是向一个文件写入41个字节(版本号加一个换行符),自然速度很快。Git的实现与项目负责度无关,它永远可以在几毫秒的时间内完成分支的创建和切换。Git的分支是完全隔离的,而SVN则没有。Git的里程碑是只读的,Git完全遵守历史不可更改这一时空法则。用户不能向git的里程碑中提交,否则里程碑就不是标记,而成了一个分支。SVN中提供了一个功能switch,使用switch可以在同一个工作树上,在不同的分支中进行切换。Git在分支中进行切换使用的命令是checkout.
14.优缺点:SVN优点:(1)、管理方便、逻辑明确,符号一般人思维习惯;(2)、易于管理,集中式服务器更能保证安全性;(3)、代码一致性非常高;(4)、适合开发人数不多的项目开发。SVN缺点:(1)、服务器压力太大,数据库容量暴增;(2)、如果不能连接到服务器上,基本上不可以工作,就不能提交、还原、对比等等;(3)、不适合开源开发,但是一般集中式管理的有非常明确的权限管理机制,可以实现分层管理,从而很好的解决开发人数众多的问题。Git优点:(1)、适合分布式开发,强调个体;(2)、公共服务器压力和数据量都不会太大;(3)、速度快、灵活;(4)、任意两个开发者之间可以很容易的解决冲突;(5)、离线工作。Git缺点:(1)、学习周期相对而言比较长;(2)、不符合常规思维;(3)、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。