一、svn和Git的比较
我们都知道传统的源代码管理都是以服务器为中心的,每个开发者都直接连在中间服务器上, 本地修改,然后commit到svn服务器上。这种做法看似完美,但是有致命的缺陷。
1. 开发者不能本地跟踪代码版本。 所有的信息都是在服务器上。 你把本地的代码改了很多,但是又不能提交。通常,本地只能缓存一个版本。对于小项目无所谓, 但是项目一复杂,人员多就麻烦了。 通常你本地的代码都全是红色的。自己都不知道今天修改了什么, 有哪些修改是真正应该提交给svn的。
2. 因为第一点,一旦离开服务器, 程序猿将无法正常工作。 因为本地不能跟踪代码版本。 你的(几乎)任何操作都必须连上服务器。比如, show log, blame,show history等等。
3. 中央服务器压力过大。 因为每个人都必须把代码提交到服务器,并且做daily build。
4. 对于大型项目, svn几乎不可用。 例如linux内核项目, 开发者何止几万? 都直接提交给svn服务器的话还不乱套了。
5. 对于个人的私人项目而言(或者对于小公司的项目), 不用版本控制当然不行,但是为了用版本控制而专门架设svn服务器有有点舍不得。
有没有能解决上述几个问题的东东呢? 恩, 答案是肯定的。
Linux内核的作者也遇到了这些问题,于是他决定再一次改变世界, 重写一个可以本地使用的svn。
如上图,就是一个典型的Git的实际生产环境,开发者之间通过 pull和push操作, 把别人的修改拉过来,或者把自己的修改推给别人。接下来我们来详细研究一下Git的过程。
二、Git的安装
Linux下安装:shell下输入sudo apt -get install git-core,按下回车后输入密码,即可完成Git的安装。
Windows下安装:先从组织SVN库的项目级标准工作环境目录中,获取Git安装包Git-1.9.5-preview20141217.exe,完成安装。
Windows上Git是可以在图形界面上进行操作的,但是不建议这么做,Git的各种命令才是你应该掌握的,并且不管你在哪个操作系统中,使用命令操作Git肯定都是通用的。
Linux系统,打开shell界面。Windows系统,打开Git Bash。
Mac OS系统:
下载地址:https://code.google.com/p/git-osx-installer/
我早已为大家下载好了,不用翻墙去下载。下载地址:http://download.csdn.net/detail/lxq_xsyu/8430713
安装好后重启控制台,执行 git --version
lixiaoqiangdeMac-mini:Documents lixiaoqiang$ git --version
git version 1.9.3 (Apple Git-50)
三、配置身份
配置身份,git config命令如下:
还可以配置开启颜色显示
git config --global color.ui true
配置了身份后,我们提交代码时Git就可以分辨是谁提交的了。
配置完成后,可以用同样的命令(去掉最后的名字和邮箱)来查看是否配置成功.
下面我们先通过两个命令删除上面的配置
创建一个版本库(用 git init -->创建文件-->改变文件内容->git add xxx->git commit -m "xxx")
可以看到在提交的时候会失败,提示我们设置用户名和邮箱,我们可以通过git config -e来查看配置文件
这三个分别是版本库级别配置文件、全局配置(用户主目录下)文件、系统配置文件(/etc目录下)
四、Git和其他版本管理系统的差异
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统 (CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,下图是其他版本管理系统的比较文件差异示意。
Git并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照 的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像下图。
五、Git文件的三种状态
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库 中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。
六、Git的暂存区理解
Git的三个基本操作、git init 、git add 和 git commit 就我们已经知道,可以通过git status 查看文件状态, git log --stat查看提交的文件的变更。
在我们创建版本库的时候会自动生成一个 .git文件夹内容如下:
文件.git/index实际上是一个包含了文件索引的目录树,就像一个虚拟的工作区,在这个目录树中记录了文件的状态信息(时间戳和文件长度等)。文件的内容并没有存储在其中,而是保存在Git对象库.git/objects目录中,文件索引建立了文件和对象库中实体之间的对应。
图中的objects就是Git的对象库,index是一个记录文件状态的暂存区,此时HEAD指向master分支的一个游标。
当我们执行 git add 命令的时候,暂存区的目录树将被更新,同时修改的文件内存会被写入Git的对象库objects中。
当我们执行 git commit 命令的时候,master分支会相应更新,master新指向的目录树就是提交时暂存的目录树。
当我们执行 git reset HEAD命令的时候,暂存区的目录树会被重写,会被master分支指向的目录树替换,但是不影响工作区。
当我们执行 git rm --cached <file>命令时,会直接从暂存区删除文件,工作区不改变。
当我们执行 git checkout . 或 git checkout -- <file> 时,会用暂存区的全部文件或指定文件替换工作区的文件。
当我们执行 git checkout HEAD . 或 git checkout HEAD <file>命令时,会用HEAD指向的master分支中的全部或部分文件替换暂存区和工作区中的文件。