1. 安装依赖包

yum -y install curl curl-devel zlib-devel perl perl-devel gettext-devel expat-devel  openssl-devel


2.下载并安装git源码包

wget http://git-core.googlecode.com/files/git-1.8.5.3.tar.gz

tar -zxf git-1.8.5.3.tar.gz 

cd git-1.8.5.3

make prefix=/usr/local/ all

make prefix=/usr/local/ install

查看是否安装成功

  git --version

3.使用配置GIT 

git clone git://git.kernel.org/pub/scm/git/git.git 更新版本库

git config --global user.name "zhaokai"  用户名

git config --global user.email zhaokai466205584@163.com(联系方式)

git config --global core.editor vi  默认文本编辑器

git config --global merge.tool vimdiff  默认差异分析工具

git config --list 查看自己的所有配置

vi  /root/.gitconfig


4.创建自己的仓库


mkdir szxy

cd   szxy

git init     开始对此目录进行git管理

touch  .gitignore     设置隐藏文件

echo "12345"  >ceshi

git status    查看下

git add ceshi git  加入缓存区

git commit -m "ceshi"  更新并起个名字

git log --stat  查看日志变化



objects目录存放的是实际的文件,当git add命令执行的时候,文件已经被存到了objects目录下。

.git/objects目录下的对象都有一个40位的id,前两位作为目录名,后38位作为文件名


.git/objects目录下的对象都有一个40位的id,前两位作为目录名,后38位作为文件名

[plain] view plaincopyprint?

  1. .git/objects$ ls  
  2. 00  06  0c  12  18  1f  26  2c  32  38  3e  44  

.index是一个索引文件。存放的是暂存区的整个目录树的信息,并且为目录树中的每个文件都保存了时间戳和长度。

当git add 将某个文件添加到暂存区的时候,index文件中添加了这个文件的基本信息

当我们修改了工作区的某个文件(比如用touch config.js修改时间戳信息),这会导致该文件的时间戳发生变化,而index里面存放的仍然是旧的信息。

此时当我们执行git status命令来检查版本库的状况:

a. git status就会用config.js的时间戳和长度和index文件里面保存的config.js的时间戳和长度进行比较。

b. 如果相同,则认为没有改变。

c. 如果发现不同。git status会继续用config.js的文件现在的内容和旧版本的config.js(保存在.git/objects中)的内容进行比较。

d. 如果内容没有改变,就简单的将最新的config.js的时间戳信息更新到index文件中

e. 如果内容改变,则提示内容发生改变。但是并不更新index文件中的config.js的时间戳信息。

由于算法优先比较时间戳和长度,避免了当时间戳相同时的文件内容的比较,因此性能比较高。

因此,git add命令会做两件事情:

a.添加文件到暂存区(.git/objects)

b.添加文件索引到(.git/index)

.当git commit被成功执行后,会产生一系列对象表示该commit的结果,都存储在.git/objects目录下。主要分成三部分:

a.tree对象表示当前commit时候的暂存区的目录树,tree对象的内容来自于.git/index文件。

b.blob对象

tree对象目录树中的文件总是以blob的对象被保存。如果tree中有三个文件,那么就有对应的三个blob对象,它们都能通过tree对象保存的这些blob对象的摘要信息(id,文件名,类型等)找到

c.commit对象

该对象记录了属于哪个tree对象,上一次commit的对象id,自己的id,作者等等。

因此,当git commit操作执行的时候,会:

a. 用.git/index文件保存的目录树创建tree对象,

b. 因此tree对象里面自然就指向了已经被git add添加到.git/objects中的blob文件。

c. .git/refs/heads/master文件保存了这次commit的id


HEAD文件保存了当前的branch,比如我的HEAD文件内容:

[plain] view plaincopyprint?

  1. chenshu@sloop2:~/work/189/appengine/.git$ cat HEAD   
  2. ref: refs/heads/master  

也就是说HEAD指向了master分支,如果存在多个分支,HEAD也可指向别的分支。

 .git/refs 目录称为引用目录

引用就是一个文件,里面包含了一个commit id。.git/refs保存了所有的引用。

.git/refs/heads目录下保存的是分支引用,比如./git/refs/heads/master文件就是master分支的引用。

.git/refs/tags目录保存了tag引用。



git rm ceshi删除某个文件

git rm --cachedceshi删除某个文件,但是不删除本地的只删除仓库里的

还原删除回来的数据  执行git status 查看命令

git mv ceshi cs  更改名字

git log --pretty=format:%an  查看某个人的提交的








git 使用的小技巧

比如有些命令记不住就可以用TAB键自动补全

首先进入源码包中的 cd contrib/completion/目录

然后复制completion.bash

cp git-completion.bash ~/.git-completion.bash

打开

/etc/bashrc

在最后一行加入

source ~/.git-completion.bash

重启后就发现忘记命令的时候按2下tab就能自动给补全了