我们都知道传统的源代码管理都是以服务器为中心的,每个开发者都直接连在中间服务器上, 本地修改,然后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的过程。
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 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分支中的全部或部分文件替换暂存区和工作区中的文件。
原文地址:http://blog.csdn.net/dawanganban/article/details/43566393