1、git基本原理与概念:git
一个git仓库,能够被分为3个区域,分别是工做区,暂存区,版本库。ide
当一个文件,在git版本库中,会有三种状态:
ui
modified(已修改) 当git工做区中新增了文件,或者原有文件被修改,没被提交到暂存区时,就是modified状态。spa
staged(已暂存) 当文件被被添加到暂存区后,就为staged状态。指针
committed(已提交) 文件从暂存区提交到版本库时的状态。对象
在工做区的文件会有两种状态:事件
untracked 未被版本库追踪。(好比说,在版本库的工做区目录里新增了一个文件,这个文件历来没有被增长到暂存区以及提交,那这个文件在工做区就是untracked状态)ip
tracked 版本库追踪状态,(已经提交过版本库,被版本库追踪的文件)it
2、经常使用操做。io
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对象文件类型。
3、git版本库目录介绍
branches 项目分支信息。
hooks hooks脚本,特定事件触发。
info 里面有一个exclude 文件,这个文件用来指定忽略工做区的指定文件或者目录。
log 记录了历史commit记录或者删除记录。
objects 这里面真正的保存了修改的内容,以及commit,tree,blob,tag这四个对象。
refs 引用指针,用于指向本地(或远程)分支或tag的指针。
config 当前git项目的配置信息
HEAD 用于指向分支的最末端(最后一次提交)。
index 暂存区文件。
COMMIT_EDITNSG 最后一次提交的注释信息。
description git 项目描述信息。
4、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 能够查看标签内容。
5、经常使用操做详解。
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]
================================