一. git 的安装
https://git-scm.com/download/linux
二. git的三个本地工作区:
working directory:
原始目录(working tree)。项目的本地开发目录。
管理命令:
A. git init 初始化空的Repository。声明当前目录是working directory,并交由git管理。
B. git rm <文件名> 它内联了git status(不检查untracked文件),即“检查相比较文档库内最新版本,变更是否发生在working directory的文件,是否有 staging area 树信息没有commit”, 如果都没有,则删除staging area的索引,删除working directory的文件。文档库的同一版本的文件则会在下一次“git commit”时被删掉,但历史版本仍将保留。
staging area:
1. 索引区(stage / cache / index)
2. track list
1+2 一起追踪(track)文件变更用
临时的追踪文件树,即还没有commit过的当前working directory 的修改,但只要add过了这一修改,文件信息就会记录在这。一旦commit,这将清除该信息,仅留在tracked类(track list)上
管理命令:
A. git add <文件名> 检查和同步一切修改 从 working directory --> staging area , 并把文件归入tracked类(track list)
<文件名>支持:1. 多文件(空格分隔);2. 目录;3. 通配符‘*
参数支持:
1. -A 作用在被删除的,更改的,新增的文件
2. . 作用在更改的,新增的文件
3. -u 作用在更改的,被删除的文件
* 当working directory 没有相对staging area的变更,git add 无效。
B. git status 检查相比较文档库内最近版本,变更是否发生在working directory的tracked文件,是否有 staging area 树信息没有commit,是否有untracked文件。
ignored的文件(目录)不会被检查
ignored的文件(目录)在 <working directory>/.gitignore里逐行定义 (记住要包括它自己)。子目录也可以有.gitignore。
.gitignore 格式:支持通配符 *;‘!’排出指定文件,即重加入tracked scope;注释 ‘#’
untracked的文件(目录)是指:
相比较文档库最新版本,检查到 有变更发生在了working directory的文件,但该文件却没有被加入staging area
C. git rm --cache <文件名> 从staging area树上删除,并把文件归入untracked类(track list)
a. 如果之前这个文件已经commit过,那在这个命令以后不会再有这个文件的新版本被提交到版本库了,但老版本仍保留在版本库
b. 如果这个文件从没commit过,这是一个完美的撤销“错误add”的操作
git rm --cache <文件名> <--反向动作 --> git add <文件名>
|| ||
unstage 文件,使它untracked stage 文件,使它tracked
D. git rm <文件名> 它内联了git status(不检查ignored文件),即“检查相比较文档库内作新版本,变更是否发生在working directory的文件,是否有 staging area 树信息没有commit”, 如果都没有,则删除staging area的索引,删除working directory的文件。文档库的同一版本的文件则会在下一次“git commit”时被删掉,但历史版本仍将保留。
git rm 生效的情况 = rm file && git add -A .
E. git mv <source_filename> <target_filename> 在working directory里mv文件,并git add -A .来更新staging area,让他知道新文件生成,就文件删除 。git commit后文档库会更新。
**注意: 改变staging area的命令,不只add和rm (mv)这一对逆操作。还有 reset, checkout.
reset 默认的--mix参数,会把staging area一起恢复到指定的commit节点的版本
checkout 旧版本(非HEAD节点)的文件时,会在staging area记录这个版本为下一次commit的版本, 所以这个checkout操作,应该紧跟一个 git reset HEAD来清除这个干扰索引
Repository
文件库。项目所有提交过的数据的最终存放区。
它是一个文件,位于working directory的 子目录 .git/
管理命令:
A. git init 初始化空的Repository。声明当前目录是working directory,并交由git管理。
B. git commit <文件名> 检查和同步一切修改 从 staging area --> Repository, 并删掉staging area 树的文件内容(不是从删掉track list上删掉)
<文件名>支持:1. 多文件(空格分隔);2. 目录;3. 通配符‘*’;4. '.' , 代表目录内所有文件(目录)
参数支持: 1. -m <comments>; 2. --author=<author_name email>
C. git commit --amend <文件名> -m <comments> --author=<> 修改上一次commit的说明
* 说明内容 保存在 <repository>/.git/COMMIT_EDITMSG
D. git reset <commit节点标识符或节点标签> 将文档库恢复到这个commit节点的状态
参数支持:1. --soft 只改变文档库; 2. --mixed(默认) staging area也同步到该节点对应的状态; 3. --hard working directory和staging area都同步到该节点对应的状态
E. git checkout <commit节点标识符或节点标签> <文件名> 从指定的commmit节点取回某文件 到working directory。
checkout 旧版本(非HEAD节点)的文件时,会在staging area记录这个版本为下一次commit的版本, 所以这个checkout操作,应该紧跟一个 git reset HEAD来清除这个干扰索引。 (这个设计,是为了checkout命令服务分支切换功能而设计的)
如果指定的commit节点没有该文件,会自动回溯更老的版本。
* 如果不指定<文件名>,操作变成了分支切换 -- HEAD指向此commit节点,形成detach head状态,长出无名分支。
F. git slash <选项> 暂存当前工作
选项: 1. save 记录tracked所有文件 与HEAD的差异 , 然后把这些文件还原成HEAD的版本
2. list 列出HEAD的commit节点标识符。 这个很重要,标签不行因为是相对的而后面会再次commit,所以需要绝对的标识符
3. pop 或 apply 取出来自save的暂存修改的记录,合并到working directory
实际使用时,在2和3之间,通常作一些其他突然来的变更任务,在commit后:
a. git checkout <2的commit节点> . 取回该版本所有tracked的数据
b. git reset HEAD 清理这个版本的索引吗??
G. git gc 整理并清理文档库里不用的数据
参数支持: 1. --aggressive 仔细清理 2. --auto 清理前先检查 有容忍度 3. --no-prune 只整理不清楚
三. git的三个配置文件
优先级由高到低
1. 对本Reporsitory的操作有效 <working directory>/.git/config
2. 对本用户的操作有效 <home directory>/.gitconifg
3. 对本系统内所有用户和文档库都有效 <git安装目录>/etc/.gitconifg
管理命令:
A. git config
选项:
1. -l 列出 高优先级的配置在末尾
2. 空选项 设置配置。ex: git config user.name 'Josie'; git config user.email 'jox@nnit.com'
3. alias.<别名> 定义git命令别名。 ex: git config alias.con 'conifg -l' 即 git con = git config -l
4. --unset 删除配置或别名。ex: git config --unset user.name; git config --unset alias.con
5. 作用范围: --system --> 2 本用户 ; --global --> 3 所有用户和文档库
四. 察看git的文档库
图形模式
gitk
命令行模式
节点标签 ,比节点标识符(SHA1 ID) 友好。
节点表示符可以只用前4bit
HEAD可以简写为‘@’
管理命令:
A. git tag <自定义节点标签> <commit节点标签或默认节点标识符> 自定义节点标签
B. git tag -d <commit节点标签或默认节点标识符> 删除自定义节点标签
察看commit信息的命令
A. git log
支持参数:
1. --graph commit 节点的演进图
* 格式:
<节点标签或节点标识符>^n // '^' 表示上一层的父commit节点,n表示选哪个父commit节点
<节点标签或节点标识符>~m // ‘~’表示上m层的父节点
2. --oneline 只显示 commit节点标识符 comments 增删改的行数
3. --author="A" 只显示author以大写字母A开的人的commit
4. --after (--since) --before (--until) 只显示指定日期间的commit
5. 其它参数 --stat --numstat --shortstat
B. git show HEAD 最新commit节点的详细数据
C. git show <节点标签或节点标识符>:<文件名> 指定commit节点的该文件的内容
D. git grep <字符串> <commit节点标识符或节点标签> 从指定的commmit节点查找某字符串
参数支持: 1. -e 多字符串查找 (or) ex :git grep -e <字符串1> -e <字符串2><commit节点标识符或节点标签>
2. -e --and 多字符串查找(and) ex:git grep -e <字符串1> --amd -e <字符串2><commit节点标识符或节点标签>
E. git blame <文件名> 察看该文件每行最后谁修改的
参数支持: -L start_line,end_line 指定察看范围
F. git shortlog 列出每个author的commit的次数和说明
报告模式
GitStats 工具 以来python 2 和 gnuplot 绘图软件包 http://www.gnuplot.info/
下载:https://github.com/hoxu/gitstats
安装: 解压
运行:python gitstats.py <git 文档库路径> <存储html文件路径>
结果:
五. git 三个工作区数据的对比
管理命令:
A. git diff 包括了两步对比:
step1. 对比working directory VS staging area //如果相同,则进入下一步
step2. 对比working directory VS repository
输出:
--- a-version_of_repository_or_cache // 指明 文件版本a 以下用 - 代表
+++ b-verison_of_working_directory // 指明 文件版本b 以下用 + 代表
@@ -<n>,<l>,+<m>,<p> @@ // @@ 指明变更发生自,从a(-)第n行起,数l行,对应b(+)第m行起,数p行
- xxxxxxxx // 指明变更内容 a文件删除(-)了xxxxx
yyyyyyyy // NA
+ zzzzzz // 指明变更内容 a文件增加(+)了zzzzz
@@ -<q>,<r>,+<s>,<t> @@ // 另一段变更的描述
- uuu
vvv
wwww
B. git diff <commit节点标识符或节点标签1> <commit节点标识符或节点标签2> <文件名> 对比该文件在两个commit节点的数据
ex: git diff HEAD HEAD^ . // 比较当前版本commit节点和他上一层父commit节点的所有数据
C. git diff --no-index <文件名1> <文件名2> 对比working directory的两个文件
D. git diff --cached <文件名> 对比staging area和repository里当前commit节点的这个文件数据
E. git diff <commit节点标识符或节点标签> <文件名> 对比working directory和repository某commit节点的这个文件数据