文章目录
当我们在学习或工作中可能会使用到同一种文档的不同版本,我们该如何快速准确的获得各种版本呢
什么是Git
Git:版本控制器
为了能够更方便的管理不同版本的文件,便有了版本控制器。所谓的版本控制器,就是一个可以记录工程的每一次改动和版本迭代的⼀个管理系统,同时也方便多人协同作业。目前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的文件,例如 doc、excel、dwg、dgn、rvt等等。对于开发人员来说,Git 最重要的就是可以帮助管理软件开发项目中的源代码文件!
注意: 所有的版本控制器,只能追踪文本文件的改动 ,比如.txt文件、各种程序代码等,每次改动时都可以知道具体的改动,比如某.txt文件第三行新增linux单词,第五行删除csdn单词。但像二进制文件 ,比如图片、视频等,虽然也能由版本控制器管理,但无法直接追踪文件的具体变化,只能知道图片大小从100kb改成了150kb这样。
Git安装
Git可以在Linux、Unix、Mac和Windows这等平台运行。
以Linux-Ubuntu为例:
安装命令:
bash
sudo apt-get install git -y
...
查看Git版本
bash
git --version
Git基本操作
初始化本地仓库
仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。执行所有的Git命令时都必须在对应的仓库中。
使用命令:
bash
git init
样例:
bash
ubuntu@VM-0-6-ubuntu:~/githome$ pwd
/home/ubuntu/githome
ubuntu@VM-0-6-ubuntu:~/githome$ git init
Initialized empty Git repository in /home/ubuntu/githome/.git/
初始化之后在当前目录下就出现了.git的隐藏目录,.git目录是Git用来追踪管理仓库的,千万不要手动修改这个目录中的任何文件!
bash
ubuntu@VM-0-6-ubuntu:~/githome$ ll
total 12
drwxrwxr-x 3 ubuntu ubuntu 4096 Feb 2 19:35 ./
drwxr-x--- 8 ubuntu ubuntu 4096 Feb 2 19:33 ../
drwxrwxr-x 7 ubuntu ubuntu 4096 Feb 2 19:35 .git/
.git目录结构:

配置Git
当安装Git之后需要配置用户名称 与email地址
使用命令:
bash
git config [--global] user.name "your name"
git config [--global] user.email "your email"

其中 --global 是一个可选项 ,如果使用了这个选项,那么本台主机的所有Git仓库都会使用这个配置。
查看配置命令:
bash
git config -l

删除对应的命令:
bash
git config [--global] --unset user.name
git config [--global] --unset user.email
工作区、暂存区、版本库
各自含义
- 工作区(Working Directory):是在电脑上你要写代码或文件的目录,如 ReadMe 文件所在的目录
- 暂存区 (Staging Area):英文叫 stage 或 index。⼀般存放在 .git 目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index)。
- 版本库 (Git Repository):又名仓库,工作区有⼀个隐藏目录 .git ,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"。
这三者之间的关系:

- Git 的版本库里存了很多东西,其中最重要的就是暂存区。在创建 Git 版本库时,Git 会为我们自动创建⼀个唯⼀的 master 分支 ,以及指向 master 的⼀个指针叫 HEAD。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区目录树的文件索引会被更新。
- 当执行提交操作 git commit 时,master 分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。
通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用git add 和 git commit 命令才能将文件添加到仓库中进行管理!!!
实际上暂存区以及版本库中保存的并不是真实的所有资源,如下图:

- 对象库(objects):里面存放的是 git 对象,修改的工作区的内容会写入到对象库中的新的 git 对象并保存起来 。master分支中保存的内容也是指向 git 对象的指针
添加文件
在包含 .git 的目录下新建⼀个 ReadMe 文件,我们可以使用 git add 命令可以将文件添加到暂存区:
- 添加一个或多个文件到暂存区:
bash
git add [file1] [file2] ...
- 添加指定目录下的所有文件包括子目录到暂存区:
bash
git add [dirname]
- 添加当前目录下的所有文件到暂存区:
bash
git add .
然后使用git commit 命令将添加到暂存区的内容提交到版本库中
- 提交暂存区全部内容到本地仓库中:
bash
git commit -m "description of the content"
- 提交暂存区的指定⽂件到仓库区:
bash
git commit [file1] [file2] ... -m "description of the content"
git commit 中的 - m 选项是用来描述本次提交的内容、记录本次提交的细节的,这部分描述不能省略。

git commit 命令执行成功后会告诉我们,1个文件被改动(就是我们新添加的 ReadMe 文件),插入了两行内容(ReadMe有两行内容)。
我们也可以多次 add 不同的文件,而只 commit 一次便可以提交所有文件,是因为需要提交的文件是都是被 add 到暂存区中,然后⼀次性 commit 暂存区的所有修改:

我们可以使用 git log 命令来查看历史提交记录:

该命令显示从最近到最远的提交的日志,并且可以看到我们 commit 时的日志消息,也可以简化输出信息:
加上 --pretty=oneline 参数:

其中,一长串的字符比如:6054f...903966 是每次提交的 commit id (版本号),Git 的 版本号不是有规律的递增的数字,而是一个经过哈希计算出来的非常大的十六进制数字。
查看 .git 目录

- index 就是我们的暂存区,add 后的内容都是添加到这里的
- HEAD 就是我们的默认指向 master 分支的指针
bash
ubuntu@VM-0-6-ubuntu:~/githome$ cat .git/HEAD
ref: refs/heads/master
- 默认的 master 分支:
bash
ubuntu@VM-0-6-ubuntu:~/githome$ cat .git/refs/heads/master
6054f80bb692c443efc30c26f8fcd9a27e903966
其中,这一长串字符,就是当前最新的 commit id 。
- objects 为 Git 的对象库,里面包含了创建的各种版本库对象及内容。当执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于 ".git/objects" 目录下。

查找 object 时要将 commit id 分成2部分,其前2位是文件夹名称,后38位是文件名称。找到这个文件之后,⼀般不能直接看到里面是什么,该类文件是经过 sha (安全哈希算法)加密过的文件,

我们可以使用 git cat-file 命令来查看版本库对象的内容
bash
# 第一步:先看看这是什么类型的对象
git cat-file -t 6054f80bb692c443efc30c26f8fcd9a27e903966
# 如果返回 "blob",表示这是一个文件
# 如果返回 "tree",表示这是一个目录
# 如果返回 "commit",表示这是一个提交
# 第二步:根据类型查看内容
# 如果是 commit:
git cat-file -p 6054f80bb692c443efc30c26f8fcd9a27e903966
# 输出类似:
# tree 7a9e0b... # 这个tree对象指向的文件结构
# parent abc123... # 父提交
# author ...
# committer ...
# 提交信息
# 如果是 tree:
git cat-file -p 6054f80bb692c443efc30c26f8fcd9a27e903966
# 输出类似:
# 100644 blob abc123... README.md
# 040000 tree def456... src
# 如果是 blob:
git cat-file -p 6054f80bb692c443efc30c26f8fcd9a27e903966
# 输出文件的实际内容
-t 选项:显示对象的类型,会返回对象的类型:blob、tree、commit 或 tag

-s 选项:显示对象的大小,会返回对象的大小(字节)
-p选项:以美观的格式显示对象的内容,-p 表示 "pretty-print"(美观打印),会显示对象的实际内容

包括一行 tree 906...c73,我们查看一下:

再查看对应的 ReadMe 05f...c43b :

这是我们对 ReadMe 做的修改,被 Git 记录了下来。
总结:在本地git仓库中
- index: 暂存区, git add 后会更新该内容。
- HEAD: 默认指向 master 分支的⼀个指针。
- refs/heads/master: 文件里保存当前 master 分支的最新 commit id
- objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改