Git版本控制工具
1. Git安装
1.1 Git官网
1.2 Windows安装Git
在windows下运行Linux工具和shell命令
1.3 Ubuntu自动安装Git
最新版本Git 需要在官网下载包,只能离线安装;这里只做自动安装:
$ sudo add-apt-repository ppa:git-core/ppa # 1.将ppa源加入到Ubuntu中
$ sudo apt-get update # 2.更新apt源
$ sudo apt-get install git # 3.在线安装git
#......
# 安装中途会出现如下提示,我们输入'Y'
Do you want to continue [Y/n]? Y
#......
$ git --version # 4.查看当前git版本号,打印版本号,表示安装成功
2. Git基本概念
2.1 常用专业术语中英对照
repository | 仓库/版本库 | merge | 分支合并 | snapshort | 快照 |
ref | 引用 | rebase | 分支衍合 | staging | 暂存区 |
bare | 裸仓库 | cherry-plck | 条件分支 | SHA1 | 哈希值 |
SVN | Subversion | squash | 压合分支 | commit | 提交 |
GIT | 分布式RCS | checkout | 检出 | branch | 分支 |
SSH | 安全传输协议 | revert | 反转提交 | tag | 标签 |
HEAD | 当前分支 | stash | 储藏 | index | 索引 |
pull | 拉取代码 | master | 主分支 | origin | 远程仓库 |
push | 推送代码 | gerrit | 代码审核 |
2.2 Git本质
一套内容寻址的文件系统
2.3 概念总结
一个仓库: 本地仓库
两个引用: 分支 + 标签
三大工作区: 工作区 + 暂存区+ 版本库
四个对象模型: commit + tree + blob + tag
2.4 工作区下的文件状态
①.未被追踪(untracked)
②.被追踪(tracked),而被追踪状态又分为以下三种:
-------------------------A.已修改(modified)
-------------------------B.已暂存(staged)
------------------------C.已提交(committed)
2.5 暂存区的本质:目录索引(staging area)
①暂存区目录:./git/index
②目录索引:
-
存储了一个tree对象所有二进制文件,可以理解为是一个结构体指针;
-
其中记录了文件名和文件状态(时间戳、长度等),文件内容保存到 ./git/object 中
2.6 Git对象模型
类型: commit + tree + blob + tag
文件名: 由SHA1算法生成, 用40个字符串用来表示对象名(目录+名字)
用途:
commit : git commit 提交到版本库后会保存一个commit;其中包括 tree、父对象、作者、提交日期等等
tree :表示目录树的内容、内容之间的层次关系,其本质是一串指向blob或其它tree对象的指针;
git ls-tree SHA1
或git cat-file -p SHA1
git cat-file -t
blob:对象内容全部是二进制格式的数据,使用git show SHA1 查看文件内容;
tag:用来标记某一个提交(commit), 通常在版本发布时候使用。
2.6 ./git 目录
2.6.1 安装 tree
$ sudo apt install tree
2.6.2 查看 ./git目录树
#查看.git下1级目录 树型结构:
$ tree -L 1
.
├── branches # 项目分支信息
├── COMMIT_EDITMSG # 默最后一次提交的注释
├── config # Git项目配置信息
├── description # Git项目描述信息
├── HEAD # 指向当前分支的末端(相当于指针)
├── hooks # 默认的hooks脚本,与特定事件触发(钩子),高级应用
├── index # 暂存区索引
├── info # 指定git要忽略的文件
├── logs # 历史记录,删除的commit对象等(回收站)
├── objects # Git数据存储对象:commit、tree、blob、tag
└── refs # Git引用:指向(远程)分支、标签的指针
3. 本地仓库操作流程
3.1 示意图
3.2 创建仓库: git init
$ mkdir tGit # 创建目录
$ cd tGit # 进入新建目录中
$ git init # 创建仓库, 注:创建好后是隐藏文件,需要使用la查看
3.3 配置git: git config
# --global:修改全局配置文件(~/gitconfig)
# --system:修改所有用户配置文件(/etc/gitconfig)
# 无参数: 修改本仓库配置文件(./.git/config)
$ git config --global user.name "MrWang522" # 1.配置姓名
$ git config --global usr.email "apt.wang@aliyun.com" # 2.配置邮箱
$ git config --global color.ui true # 3.开启颜色差异显示
$ git config --global --list # 4. 查看当前用户配置
#打印输出以下内容表示配置成功,按键`q`退出
usre.name=MrWang522
color.ui=true
usr.email=apt.wang@aliyun.com
# 补充记录(不用执行): 设置指令别名 ------------------------------------------------------
$ git config --global alias.cfg config # 对 config 指令,起别名叫 cfg, 在 ./config 文件内保存
3.4 查看文件当前状态: git status
$ vi test.c # 在git版本库中创建用于测试的文件,内容随意
$ git status # 使用该命令查看当前文件状态
# 打印结果为:
On branch master # 文件存在于主分支
No commits yet # 该文件没有被提交
Untracked files: # 该文件没有被追踪
(use "git add <file>..." to include in what will be committed) # 使用 git add 指令添加到暂存区
test.c
3.5 将文件保存到暂存区: git add
$ git add test.c # 将test.c文件从工作区添加到暂存区
$ git status # 查看当前文件状态
# 打印结果为:
On branch master # 文件存在于主分支
No commits yet # 该文件没有被提交
Changes to be committed: # 已经保存到暂存区
(use "git rm --cached <file>..." to unstage) # 使用 git rm --cached 指令取消暂存
new file: test.c
3.6 将暂存区快照提交到版本库: git commit
# 1.添加到版本库
# 双引号中的内容为提交日志信息
# 如果不加参数 -m "日志",则会自动弹出vim文本编辑区,手动输入日志内容
$ git commit -m "xxx"
# 打印结果为:
[master (root-commit) 41e7fc1] add test.c
1 file changed, 7 insertions(+)
create mode 100644 test.c
# 2. 查看当前文件状态
$ git status
# 打印结果为:
On branch master
nothing to commit, working tree clean # 表明暂存区为空,提交成功
3.7 查看当前提交信息: git log
$ git log # 查看已经提交过的信息
commit beb45ceae7c3ae6530f4bf4f5be0b9da483f9aeb (HEAD -> master)# 哈希值,是git对文件做的一些加密算法处理,使用指令 git show 哈希值可查看
Author: MrWang522 <apt.wang@aliyun.com> # 作者信息
Date: Sat Mar 14 01:02:12 2020 +0800 # 提交时间
xxx # 提交的日志信息内容
# 参数: --oneline 单行显示(简略版SHA1)
$ git log --oneline
4fdba77 (HEAD -> master) modify test.c # 最近有一次提交 ...
# 参数: --pretty=oneline 单行显示(详细版SHA1)
$ git log --pretty=oneline
4fdba77fb51304a35a9bec195471dbb01d9f652f (HEAD -> master, tag: v1.0) modify test.c
# 参数: -p 查看当前每个版本做的修改
$ git log -p
commit beb45ceae7c3ae6530f4bf4f5be0b9da483f9aeb
Author: MrWang522 <apt.wang@aliyun.com>
Date: Sat Aug 1 11:19:29 2020 -0400
create git and add test.c
diff --git a/test.c b/test.c
new file mode 100644
index 0000000..fabd2a2
--- /dev/null
+++ b/test.c
@@ -0,0 +1,2 @@
+
+hello git!
# 查看提交的类型
$ git cat-file -t 4fdba77 # 查看提交文件的类型
commit # 类型为:commit
# 查看提交文件的内容
$ git cat-file -p 4fdba77
tree 5c95f551931eb21a94917788ee24dfa47e212fe1 # 当前tree结构
parent beb45ceae7c3ae6530f4bf4f5be0b9da483f9aeb
author MrWang522 <apt.wang@aliyun.com> 1596296392 -0400
committer MrWang522 <apt.wang@aliyun.com> 1596296392 -0400
modify test.c
3.8 通过哈希值查看具体内容: git show SHA1
$ git show beb45ceae7c3ae6530f4bf4f5be0b9da483f9aeb
# 打印结果为:
commit beb45ceae7c3ae6530f4bf4f5be0b9da483f9aeb (HEAD -> master)# 哈希值
Author: MrWang522 <apt.wang@aliyun.com> # 作者信息
Date: Sat Mar 14 01:02:12 2020 +0800 # 提交时间
xxx
diff --git a/test.c b/test.c # 具体显示内容
new file mode 100644
index 0000000..fabd2a2
--- /dev/null
+++ b/test.c
@@ -0,0 +1,2 @@
+
+hello git!
3.9 查看工作区与暂存区的不同: git diff
$ vi test.c # 在原来的文件中,新增内容
# ... ...
$ git diff # 查看新增内容
# 打印结果为:
diff --git a/test.c b/test.c
index fabd2a2..1d8e3b2 100644
--- a/test.c
+++ b/test.c
@@ -1,2 +1,5 @@
hello git!
+
+the second love you! # +号代表新增的内容
+
3.10 从工作区直接提交到版本库中: git commit -a
# 1.直接从工作区提交到版本库
# 不建议使用,是将工作区内所有文件全部提交至版本库中
$ git commit -am "modify test.c"
[master 4fdba77] modify test.c
1 file changed, 3 insertions(+)
# 2.查看状态
$ git status
On branch master
nothing to commit, working tree clean
# 3.查看两次提交的版本
$ git log
commit 4fdba77fb51304a35a9bec195471dbb01d9f652f (HEAD -> master)
Author: MrWang522 <apt.wang@aliyun.com>
Date: Sat Aug 1 11:39:52 2020 -0400
modify test.c
commit beb45ceae7c3ae6530f4bf4f5be0b9da483f9aeb
Author: MrWang522 <apt.wang@aliyun.com>
Date: Sat Aug 1 11:19:29 2020 -0400
create git and add test.c
4. 本地仓库文件操作
4.1 文件添加到暂存区: git add
$ git add xxx.c # 添加xxx.c到暂存区
$ git add . # 添加所有文件到暂存区, 加入Git追踪范围
4.2 将暂存区文件提交到版本库: git commit
$ git commit -m "commit info" # 单步提交
$ git commit -a # 一次性提交(不建议这样做)
$ git commit --amend # 覆盖最后一次提交版本
4.3 从工作目录和暂存区中删除文件: git rm
$ git rm -f xxx.c # 从工作目录和暂存区中删除该文件,提交后不被追踪,但版本库中仍有这些文件的快照
$ git rm -cached xxx.c # 从暂存区中删除该文件,但工作目录下保留文件
4.4 文件重命名: git mv
$ git mv old_file new_file # 将文件:old_file 重新命名为 new_file
# 实质上是删除旧文件,创建新文件(保留旧文件内容)
4.5 忽略文件到暂存区/版本库: .gitignore
$ vi .gitignore # 在目录下手动创建忽略文件
# 添加需要忽略的文件: glob模式匹配
1. 忽略某种格式结尾的文件 ---> *.[ao] # 以.a 和 .o 结尾忽略
2. 忽略临时文件 -----------> *~
3. 不不不不忽略某个库文件----> ! xxx.a
4. 忽略某个某个目录下的文件--> /xxx/xxx/*.a
4.6 撤销修改: git checkout/reset
$ git checkout xxx # 撤销已经修改的文件
$ git reset --soft HEAD^/SHA1 # 将版本库 回退到 前一次/指定哈希值的版本 到暂存区
$ git reset --mixed HEAD^/SHA1 # 将版本库 回退到 前一次/指定哈希值的版本 到工作区
$ git reset --hard HEAD^/SHA1 # 将版本库、暂存区、工作区 恢复到 前一次/指定哈希值的版本(恢复后不可回退,比较危险)
4.7 差异比较: git diff
$ git diff # 查看暂存区 与 工作区 不同的内容
$ git diff --cached # 查看最新的版本库 与 暂存区 不同的内容
$ git diff --staged SHA1 # 查看某个版本库 与 暂存区 ...
$ git diff SHA1 SHA2 # 比较两个版本之间的差异
4.8 压缩仓库: git diff
Git快照也会占用磁盘空间,使用该指令压缩增量存储单元,节省磁盘空间。
$ du -sh # 查看当前仓库大小
204K .
$ git gc # 压缩
$ du -sh # 压缩后大小
172K .
5. 查看提交历史
5.1 版本差异显示: git log
$ git log # 查看已经提交过的信息
$ git log --oneline # 参数: --oneline 单行显示(简略版SHA1)
$ git log --pretty=oneline # 参数: --pretty=oneline 单行显示(详细版SHA1)
$ git log -p # 参数: -p 查看当前每个版本做的修改
$ git log -2 # 查看最近的n次提交
$ git shortlog # 查看每个版本修改差异,精简显示...
$ git log -c/C xxx # 查看某个指定文件的提交修改信息
$ git log --graph # 显示分支提交历史信息
$ gitk # 图形显示分支情况,前提是要安装:$ sudo apt install gitk
5.2 查看文件每一行的提交信息: git blame
$ git blame xxx # 查看文件xxx的每一行的提交信息
$ git blame xxx -L 2,+1 # 查看滴2行到第3行的具体信息
6. 分支和标签基本操作
不同分支内的文件是不共享不可见的
6.1 查看/新建分支: git branch
$ git branch # 查看当前分支
* master # 当前处于主分支
$ git branch test # 新建分支:test
$ git branch # 查看当前分支
* master #当前处在的分支
test
6.2 切换分支: git checkout
$ git checkout test # 切换到 test 分支
Switched to branch 'test'
$ git branch
master
* test # 当前处在的分支
6.3 标签操作: git tag
# 相当于一个指针常量,用作标记使用,常用于发布版本信息
$ git tag v1.0 # 添加标签
$ git tag # 打印所有标签
$ git cat-file -p v1.0 # 查看标签信息 ........ 1
$ git show v1.0 # 查看详细信息 ........ 2
7. 克隆远程仓库: git clone
$ git clone 克隆仓库地址链接 # 克隆 该远程仓库到当前目录下