第一部分: 三大工作区
![](https://box.kancloud.cn/8c3c1876fb569ce9711fdc23f0ebb9e0_775x387.png)
版本库中的文件有三种状态:
----已修改: modified
-----已暂存: staged
-----已提交: commit
1)工作目录(工作区)
理解:1)该目录存放开发人员开发的代码文件
2)该目录里的代码文件,可以进行版本控制
3)该目录下有一个隐藏文件.git
2)暂存区
理解:
1)理解为一个虚拟工作区,这个虚拟工作区会跟踪工作区的文件变化
2)存储一个tree对象的所有信息的二进制文件,分别指向不同的blob、tree对象
3)我们修改的实际内容并没有保存到暂存区,在暂存区存放的是文件索引,该文件索引建立文件和版本库中对象之间的关联
3)版本库
理解:
工作目录下的.git文件夹就是版本库
版本库里的文件描述:
![](https://box.kancloud.cn/26547715baf6b11fe578f17d9942e46e_972x460.png)
$ cat HEAD
ref: refs/heads/new
HEAD表示:指向当前分支最新一次提交
注意事项:
1)千万不要删除或更改版本库(.git)目录下的所有文件
2)新创建的文件,第一次没有被版本库追踪,使用gti status查看状态,会显示《untracked》
3)可以通过git add 命令把工作区里的文件,添加到暂存区
4)可以通过git commit命令把暂存区里文件,提交到当前版本库
可以简单理解为,将需要提交到版本库的的所有文件变更通通放到 暂存区,然后,一次性提交 暂存区 中的所有修改。
演示1:
![](https://box.kancloud.cn/6c53a9454628c69dae209995ebe4ed87_973x589.png)
演示2:
![](https://box.kancloud.cn/bda0ba6aece0d9a0e4764e388a14a3c4_939x629.png)
第二部分: 四个对象 (文件在git版本库里是如何存放的)
1、git 对象模型
1)git的每个对象在git版本里,用40个字符串来表示对象名,
2)字符串由对象内容做sha哈希计算得到
3)通过比较SHA的值确定两个文件内容是否发生改变
2、不同类型的对象用途
A:blob 存储文件数据,通常是一个文件
理解:
1)工作区里的每个文件,提交到版本库,是以二进制的形式存储的
2)blob对象,通过表示的是单个文件
3)通过git show SHA1查看blob里的内容
B:tree:存放一个目录,通过用来管理tree和blob(因为在一个目录里可以新建目录和文件)
理解:
1)tree对象像一个目录,用来管理“tree”和“blob”对象
2)一般用来表示内容之间的目录层次关系
C: commit: 指向一个tree,标记项某个特定时间点的状态,每执行一次git commit命令,就会生成一个commit对象
理解:
1)“commit”对象指向一个“tree对象”
2)标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、
3)有指向上次提交的指针,方便版本回退
D: tag: 用来标记某一个提交(commit)
理解:
1)tag对象也是指向某个特定的commit提交
2)我们一般情况下,会基于最近一次commit提交打一个tag标签,标志着一个版本发布(里程碑)
![](https://box.kancloud.cn/82f33d80e3d099fb1f24b2cc03abea2c_415x278.png)
演示:
![](https://box.kancloud.cn/1d93e80b25c4c757a0ab6059cd9eff0c_1119x641.png)
第三部分:二个引用
二个引用:分别为分支、标签
理解:
1)分支和标签实际上就是对commit对象提交的引用
2)引用存放路径: .git/refs
$ ll
total 0
drwxr-xr-x 1 Administrator 197121 0 一月 26 14:00 heads/
drwxr-xr-x 1 Administrator 197121 0 一月 26 11:20 tags/
heads目录:存放所有分支的指针
tags目录: 存放所有的标签
分支使用场景:
1) 比如多人开发一个项目,A程序员开发模块A,B程序员开发模块B,这个时候,每个人都会基于当前master分支,创建一个属于自己的分支出来,每次提交到自己的分支上,一定时期后,合并到master分支
2)比如当版本1.0发布后,然后又要开发一个功能,我们就会创建一个New分支出来。此时过了2天,发现之前的版本1.0有问题,我们最好的建议,回退到版本1.0,然后创建一个分支出来,专门用来修复bug,修复完毕后把这个bug合并到master分支,然后切换到New分支,把master分支上通过git rebase到new分支
标签(tag)的使用场景:
1)一般用来标记一个里程牌,一个程序版本的发布
2)程序发布的时候,可以基于tag来发布和回退
演示1:
![](https://box.kancloud.cn/c61ed80b82d247ebc6e3be7622bd07d2_948x554.png)
演示2:标签 (创建一个轻tag)
Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git (GIT_DIR!)
$ git tag v1.0 --创建一个版本
Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git (GIT_DIR!)
$ cd refs/tags/
Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git/refs/tags (GIT_DIR!)
$ ll
total 1
-rw-r--r-- 1 Administrator 197121 41 一月 26 14:48 v1.0
Administrator@WIN-0JU14CFTKDB MINGW32 /e/project/test01/.git/refs/tags (GIT_DIR!)
$ cat v1.0
27ec4bc2d21589316c58dcf2ecc9e30871b9878d
(tag标签其实也是基于某一次commit提交来创建的)
演示3:
![](https://box.kancloud.cn/6b20f0dd91bfe1328335d7690b8a9c4a_972x583.png)
- 第一部分:Git的基本操作
- 第一章:git软件的安装
- 第一节:在centos6.8上安装git-2.3
- 第二节:在windows上安装git-bash和TortoiseGit软件
- 第二章: Git的基本概念
- 第一节:git的基本操作
- 第二节:git的深入理解(内部运行机制)
- 第三章:git的文件管理
- 第一节:文件的添加及提交
- 第二节:文件的删除、回退等
- 第三节:忽略指定格式的文件
- 第四节:撤销本地仓库的修改
- 第四章:git的commit对象深入理解
- 第一节:查看提交历史(git log)
- 第二节:提交查找(git grep)
- 第三节:git版本库回退
- 第五章: Git分支管理
- 第一节:分支的概念及基本使用
- 第二节:Git分支管理策略
- 第三节:Git分支合并
- 第四节:推送本地分支到远程分支
- 第七章: Git常用命令详解
- 第一节:git fetch命令
- 第二节:git pull命令
- 第三节:git push命令
- 第四节: git merge命令
- 第五节:git rebase命令
- 第八章:远程仓库管理
- 第二部分: gitlab版本控制系统
- 第一节:"远程仓库”版本回退解决方案
- 第二节:远程分支和本地分支
- 第九章:Git冲突解决
- 第十章:客户端操作
- 第十章:git常规操作
- 第一章:安装gitlab服务器
- 第一节:在centos系统上安装
- 第二章:配置GitLab服务器
- 第一节:关闭gitlab注册功能
- 第二节:在gitlab上创建项目、组、用户
- 第三节:汉化gitlab
- 第四节:gitlab配置邮箱通知
- 第五节:gitlab配置https访问
- 第三章:使用过程常见的故障
- 第三部分: gogs版本控制系统
- 第一章:在centos6上基于二进制包安装gogs软件
- 第二章:gogs服务器的配置
- 第一节:gogs服务器上创建项目、用户
- 第二节:nginx反代gogs,通过https
- 第三节:gogs启动脚本
- 第四节:git保存密码到本地
- 第三章:gogs服务器的备份和恢复
- 第一节:gogs备份操作