Git版本控制

Git版本控制工具

1. Git安装

1.1 Git官网

https://git-scm.com/

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哈希值
SVNSubversionsquash压合分支commit提交
GIT分布式RCScheckout检出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 SHA1git 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 克隆仓库地址链接		# 克隆 该远程仓库到当前目录下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盗骊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值