一、git基本原理与概念:

一个git仓库,可以被分为3个区域,分别是工作区,暂存区,版本库。

当一个文件,在git版本库中,会有三种状态:

modified(已修改)  git工作区中新增了文件,或者原有文件被修改,没被提交到暂存区时,就是modified状态。

staged(已暂存)  当文件被被添加到暂存区后,就为staged状态。

committed(已提交)  文件从暂存区提交到版本库时的状态。


在工作区的文件会有两种状态:

untracked  未被版本库追踪。(比如说,在版本库的工作区目录里新增了一个文件,这个文件从来没有被增加到暂存区以及提交,那这个文件在工作区就是untracked状态)

tracked 版本库追踪状态,(已经提交过版本库,被版本库追踪的文件)


二、常用操作。

git init   #初始化一个git仓库。

git config --gloabl user.name "shz"  #配置代码提交人姓名

git config --global user.emall "shz.qq.com" #代码提交人邮箱

git config --global color.ui true  #显示颜色差异。(不同的状态会有颜色差异)

配置参数以及配置文件位置:

--global 当前用户全局配置文件 ~/.gitconfig

--system:  修改所有用户的配置文件:/etc/gitconfig

   修改当前版本仓库的配置文件  .git/config


git add  [xxx] #将文件添加到暂存区。

git commit ["text"]  #将暂存区的文件提交到版本库。

git log #查看提交历史

git status # 查看当前git仓库中文件的状态。

git diff #可以查看一个文件在工作区和暂存区的差异。

git show  [SHA1] #查看一个具体的提交。

git clone #克隆一个远程仓库。


分支操作:

git branch  [xxx] 创建一个新的分支。

git checkout [xxx]  切换到指定分支。

git tag [v1.0]  添加一个标签。


其他操作:

git show  [SHA1] #可以看指定的某次提交对文件作出的修改(其实就是查看blob文件的内容。)

git cat-file -p [filename]  #查看git对象文件内容。

git cat-file -t [filename] #查看git对象文件类型。

 

三、git版本库目录介绍

branches  项目分支信息。

hooks      hooks脚本,特定事件触发。

info    里面有一个exclude 文件,这个文件用来指定忽略工作区的指定文件或者目录。

log     记录了历史commit记录或者删除记录。

objects  这里面真正的保存了修改的内容,以及commit,tree,blob,tag这四个对象。

refs  引用指针,用于指向本地(或远程)分支或tag的指针。

config 当前git项目的配置信息

HEAD  用于指向分支的最末端(最后一次提交)。

index 暂存区文件。

COMMIT_EDITNSG 最后一次提交的注释信息。

description git 项目描述信息。


四、git对象介绍:

git内部有四种数据对象类型,分别是blob,tree,commit,tag。

blob:用来存储文件的数据。

通过git show commit提交的哈希值  就可以看到blob对象内部的内容了。

例如:git show 0ba6f2a65f03788ac52e31aa7b2eb95731dc7437 就可以看到这次commit都做了哪些修改。


tree: 像一个目录树结构,用来管理其他tree和blob

tree维护的就是一个git仓库中的目录树结构,里面具体指向了哪个tree或者哪个blob 可以通过 git cat-file来查看。


commit:指向一个tree,用来标记某个目录文件某个时间点特定的状态。(每次提交代码到本地的版本库git commit后就会产生一个commit对象。)

commit对象主要有以下几个部分构成:

1.一个tree对象

2.父对象

3.作者

4.日期

5.提交者

为什么要有父对象?

父对象指向了上一次提交的操作,当每次修改然后提交,commit对象本身并不会存储修改的内容,文件修改的内容都是通过和父对象的比较而来的。



tag: 用来指向一个commit。

其实git的分支,标签都是对commit对象做了一个指针,这个指针的存放路径在.git/refs下。

据说git内部有两种tag,一种就是commit指针,另外一种tag是个完整的tag对象。

tag对象组成:

对象名,标签名,对象类型,标签创建这者名字。

tag标记会指向一个commit的SHA1.

tag标签与分支的最大区别是?

tag标签与分支虽然都指向一个commit,但是tag标签是一个常量指针,是不能改变的。

而分支确是一个变量指针。

git cat-file -p 可以查看标签内容。


五、常用操作详解。

1.将文件添加进暂存区。

git add [文件名]  #将一个文件添加进暂存区。

git add . #一次性添加当前工作区中所有的文件到暂存区。

#这一步操作可以将git仓库未追踪的文件加入到git仓库的追踪范围,如果文件已被git仓库追踪,那么就会将本次修改添加到暂存区中。


2.将暂存区的文件提交到本地代码库。

git commit -m "commit info" #单步提交,只执行将暂存区文件提交到版本库的操作。

git commit -a #一次性提交,将add到暂存区的操作也一并做了。(这种提交方式生产环境不推荐。)

git commit --amend  #修改最后一次提交。


3.文件删除。

#同时将某文件从工作目录和暂存区删除:

git rm  -f [filename]

# 如果通过rm命令直接进行删除,然后再commit提交,虽然git不会再追踪这个文件,但是,里面还会保存有已删除文件的快照。


#从暂存区中删除,在工作目录中保留.

git rm --cached  [xxx]


#从版本库中删除,版本回退到错误提交之前。

#将错误提交到版本库的数据回退到暂存区。

git reset -soft [SHA1]


#将错误的提交从暂存区回退到工作区。

git reset -mixed [SHA1]


#将工作区,暂存区,版本库恢复到指定版本。

git reset --hard SHA1


4.重命名。

git mv  [old_file] [new_file]

实际操作:

mv [oldfile] [newfile] 首先文件重命名。

git rm old_file  #删除

git add new_file #增加


5.撤销修改。

撤销对工作区的修改:

git checkout [filename]  #让工作区中的文件回到最近一次commit 或者 add 的状态。

#若文件还没添加到暂存区时,执行这条撤销语句,会变的和版本库中记录的一样。

#若文件已添加到暂存区并做了修改,则会回到暂存区的状态!


撤销对暂存区的修改:

git reset HEAD [filename] #将添加到暂存区的修改回退到工作区。


撤销对版本库的提交:

git reset --hard [sha1]


6.差异比较。

比较工作区和暂存区的差异。

git diff  #查看尚未加入到暂存区的文件有哪些新的修改。


查看暂存区和版本库的差异。
git diff  --cached  #默认参数是HEAD  就是和版本库中最后一次commit做比较。

git diff --staged 【SHA1】  #和版本库中的某个commit进行比较。



查看工作区和版本库的差异。

git diff HEAD【SHA1】


   

比较两个版本提交之间的差异。

git diff 【SHA1】[SHA2]

================================