赞
踩
目前主流的版本管理工具可分为集中式(如SVN)与分布式(GIT),。
集中式版本控制系统,版本库是集中放在中央服务器的,工作时需要从中央服务器拿到最新的版本,多人共同开发时,只有某个人先同步到服务器,其他人才能在他开发的基础上继续。集中式版本控制系统必须联网,因此有带宽的要求。
分布式版本控制系统,简单说就是每个开发者都有本地的一个完整版本库,在无网环境下,也可以开发,对于同一文件的开发,可以同时进行。
工作区:就是你在电脑里能看到的目录,磁盘目录,
版本库(本地仓库):工作区有一个隐藏目录.git, 这个不是工作区,而是Git的本地版本库,Git版本库里有很多东西,其中很重要的一块是index暂存区
远程仓库:远程仓库是git的远程服务器,多人协作通过远程仓库同步
Git里很重要的一块是index暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
当你创建了一个git项目,并且在工作空间添加或修改文件,执行git add
后,就将添加或修改的内容提交到stage(或称index);而执行git commit
就是将暂存区的所有修改内容一次性提交给了本地仓库了;执行git commit
后,如果你又没有对工作区做任何修改,那么暂存区就是“干净”的
$ git status
On branch master
nothing to commit, working tree clean
最后,你再执行git push
就将本地仓库的内容同步到远程仓库了。
下面,我们以一个实例,解释Git的运行过程,帮助理解Git原理
首先,让我们创建一个项目目录,并进入。
$ mkdir git_demo && cd git_demo
要对该工作目录进行git版本管理,第一件事就是使用git init
命令,进行初始化。
$ git init
git init
命令只做一件事,就是在项目根目录下创建一个.git
子目录,用来保存版本信息。
$ ls .git
branches/
config
description
HEAD
hooks/
info/
objects/
refs/
接下来,新建一个空文件夹doc.txt,并且把这个文件加入Git仓库,也就是为doc.txt的当前内容创建一个副本
$ touch test.txt
$ git hash-object -w doc.txt
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
上面代码中,git hash-object
命令把doc.txt的当前内容压缩成二进制文件,存入Git。压缩后的二进制文件,称为一个Git对象,保存在.git/objects
目录
文件保存成二进制对象以后,还需要通知Git哪些文件发生了变动。所有变动的文件,Git都记录在一个区域,叫做“暂存区(index或stage)”,再统一把暂存区里面的文件写入正式版本历史。
git update-index
用于在暂存区记录一个发生变动的文件。
$ git update-index --add --cacheinfo 100644 \
3b18e512dba79e4c8300dd08aeb37f8e728b8dad doc.txt
上面命令向暂存区写入文件名doc.txt
、二进制对象名(哈希值)
和文件权限
上面两步(保存对象和更新暂存区),如果每个文件都做一遍,那是很麻烦的。Git提供了git add
命令简化操作
暂存区保留本次变动的文件信息,等到修改了差不多了,就要把这些信息写入历史,这就相当于生成了当前项目的一个快照(snapshot)
项目的历史就是由不同时点的快照构成。Git可以将项目恢复到任意一个快照。快照在Git里面有一个专门名词,叫做commit,生产快照又称为完成一次提交(下面所有提到“快照”的地方,指的就是commit)
首先,设置一下用户名和Email,保存快照的时候,会记录是谁提交的。
$ git config user.name "用户名"
$ git config user.email "Email 地址"
接下来,要保存当前的目录结构。前面保存对象的时候,只是保存单个文件,并没有记录文件之间的目录关系(哪个文件在哪里)
git write-tree
命令用来将当前的目录结构,生成一个Git对象,目录对象也是作为二进制保存在.git/objects
目录里面,对象名就是哈希值。
所谓快照,就是保存当前的目录结构,以及每个文件对应的二进制对象。上一个操作,目录结构已经保存好了,现在需要将这个目录结构与一些元数据一起写入版本历史。
git commit-tree
命令用于将目录树对象写入版本历史
$ echo "first commit" | git commit-tree c3b8bb102afeca86037d5b5dd89ceeb0090eae9d
c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
上面代码中,提交的时候需要有提交说明,echo "first commit"
就是给出提交说明。然后,git commit-tree
将元数据和目录树,一起生成一个Git对象
Git commit命令,简化提交的操作。保存进暂存区以后,只要git commit一个命令,就同时提交目录结构和说明,生成快照
$ git commit -m "first commit"
所谓分支(branch)就是指向某个快照的指针,分支名就是指针名。哈希值是难以记忆的,分支就是快照的别名。比如,master分支就是由一个叫做master指针,它指向的快照就是master分支的当前快照
用户可以对任意快照新建指针。比如,新建一个fix-typo分支,就是创建一个叫做fix-typo的指针,指向某个快照。所以,GIt新建分支特别容易,成本极低。
Git有一个特殊指针HEAD
,总是指向当前分支的最近一次快照。另外,Git还提供简写方式,HEAD^
指向HEAD
的前一个快照(父节点)。
每一个分支指针都是一个文本文件,保存在.git/refs/heads/
目录,该文件的内容就是它所指向的快照的二进制对象名(哈希值)
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。