一、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]
================================