以前也了解学习过Git这一版本控制系统,但没有经常使用的情况下,很多命令就忘得一干二净了。正好最近有空闲时间,决定将它重新拾起来,毕竟Git和GitHub作为十分优秀的版本控制和代码托管平台,很有必要把它学好~

1. Git简介

1.1 集中式版本控制和分布式版本控制

Git是Linux创建者Linus使用C语言写的一个分布式版本控制系统。另一非常出名的版本控制系统是SVN,它是集中式的版本控制系统。它们之间有什么区别呢?

集中式版本控制系统,版本库是集中放在中央服务器的。需要使用的时候,需要先从中央处理器获取最新的版本库,开始进行自己的工作,工作完后再将版本库推送回中央服务器。而这样的最大缺点就是必须要联网,在有些情况下还是有些不方便的。

而在分布式版本控制系统中,没有所谓的中央服务器,每台PC上都有完整的版本库,工作的时候直接在本地就可以操作。如果两个人之间需要协作,那他们互相推送自己的修改就可以了。但考虑到多人协作的情况,Git也有一个“中央服务器”——GitHub,方便多人交换各自的修改。

1.2 为什么要使用Git?

比如当你写毕业论文的时候,最开始的时候是初稿,然后经过修改你的文件夹会变成这样…

这样修改多次之后,就算是记性再好的人也难免记不清每个文档相较于最初做了哪些修改,十分容易混淆。而且如果你想回到之前你修改过的某一个版本,这么多的文档下,也很难记得符合自己要求的是哪一个了吧😂。如果能有下面这样的版本记录,那么对于这些修改就得心应手了。

版本 文件名 用户 说明 日期
1 readme.txt 小明 增加readme文档 2020.1.19
2 readme.txt 小华 删除配置说明 2020.2.5

这样就进入了版本控制的20世纪~

1.3 安装Git

进入Git官网下载Windows版本的二进制文件进行傻瓜式安装即可。

安装好后,打开git bash,配置用户名和邮箱(因为Git是分布式版本控制系统,因此每台机器都需要表明自己的身份。)

1
2
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱名"

global参数表示这台机器上的所有仓库都会使用这个配置。

2. 使用Git在本地进行版本控制

2.1 初始化版本库

打开git bash,创建新文件夹LearnIt,切换到文件夹中

1
2
mkdir LearnIt
cd LearnIt

使用git init初始化版本库git init

这就在本地创建好了一个新的版本库(实际上版本库就是文件夹下面的.git文件夹下的内容[看不见该文件夹的可以打开查看隐藏文件选项])。

2.2 add和commit

创建好版本库之后,怎样进行文件的版本控制呢?

需要先了解一下Git的工作原理

这里的工作区(Working Directory)就是LearnIt文件夹下的内容,版本库就是.git文件夹下的内容。版本库分为两个部分:暂存区(stage)和主分支(master)。

整个版本控制的流程大致就是将工作区的修改先提交到暂存区,再将暂存区的内容推送到主分支上,这样版本库就保存了工作区最新的信息。当工作区的内容更新时,需要进行相同的操作来更新版本库。最终操作版本库就可以对不同版本的工作区内容实现版本控制了。

那么在LearnIt文件夹下创建readme.txt

1
vim readme.txt

输完后按Esc进入末行模式,输入wq保存退出。

使用git add readme.txt命令将工作区文件添加到暂存区。

使用git commit -m "添加readme.txt"命令将暂存区文件添加到master主分支(””内部是这次提交的注释,帮助你了解每个版本究竟干了什么事情。)。

使用git status查看Git当前状态。

提示工作区是干净的,即工作区的所有修改已经全部提交到了版本库。

2.3 修改文件进行版本更新

readme.txt```进入文本进行修改
1
2
3
4
5
6
7
8
9

![](https://gitee.com/shenshilei1022/hugo_image_resource/raw/master/imgs/%E4%BF%AE%E6%94%B9readme%E6%96%87%E4%BB%B6.png)

这时使用```git status```查看Git状态

![](https://gitee.com/shenshilei1022/hugo_image_resource/raw/master/imgs/Git%E7%8A%B6%E6%80%81_2.png)

提示有修改没有提交到暂存区,且没有commit

git add readme.txt
git commit -m “append GPL”
```

使用上述命令进行版本库更新。

使用git log命令就可以查看版本一览了,如果嫌显示信息过于繁杂,则可以带上--oneline参数,显示格式即如博文前面的表格格式了。

黄色的一串字母数字码是commit id(版本号),之后版本回溯的时候会用到。

HEAD -> master 表示当前所处的位置在master分支,且指向”append GPL”版本,(HEAD是一个指针,移动它就相当于移动当前所在的版本。之后要用)。

2.4 版本回溯

再修改一下readme.txt

此时先不要add进暂存区,使用git diff命令可以比较目前工作区文件和版本库当前版本文件的区别。

add commit更新版本库,查看版本一览

此时,若觉得当前这个professional版本是多余的,想回到append GPL版本,使用git reset --hard HEAD^来回到上个版本(HEAD^表示当前HEAD的前一个版本,HEAD^^则表示前两个,以此类推。当然,数量多了以后可以使用HEAD~20表示HEAD的前20个版本)。

从而回到了append GPL版本,打开文件,确实回到了之前的版本。

如果一个版本库中有几十上百个版本,使用HEAD^这种方法很繁杂,这时候轮到commit id出场了,git reset --hard 版本号来切换到版本号对应的版本。小技巧:版本号不用输全,一般输个四五位就够了~

但是又有情况出现了,又想回到append professional版本了,可是git log命令已经不能显示append professional版本的版本号了,怎么办呢?使用git reflog命令查看历史操作,可以看到需要的版本号,再使用reset命令即可达到回到未来的操作啦!

2.5 撤销操作

编辑文件readme.txt.

当保存之后,你突然发现不对,最后一句不能出现在文件当中。此时,再打开文件把这句话删掉吗😂?当然这样也可以,但Git还提供了更简单的方法。使用git checkout -- 文件名可以直接撤销工作区的改动。

但如果已经把修改提交到了暂存区,需要使用git reset HEAD readme.txt把暂存区的文件撤销回工作区(使用HEAD表示最新的版本),在使用git checkout -- 文件名撤销工作区的改动。

2.6 删除操作

添加一个test.txt文件提交到版本库。通常我们删除文件是从文件管理器中直接删除或是使用rm命令。此时查看Git状态

此时,如果你仍旧需要删除文件,则执行git rm 文件名,再进行提交git commit -m "删除test.txt",现在,文件就从版本库中被删除了。

另一种情况就是删错文件了,不过不要紧,版本库中还有这个文件,又因为暂存区没有变动。直接执行git checkout -- test.txt来撤销工作区的操作。但是如果已经执行了git rm 文件名,这时暂存区发生了变动,需要先撤销暂存区变动(git reset HEAD 文件名),再撤销工作区变动(git checkout -- 文件名).

删除的文件之前必须提交到过版本库才可恢复!

3. 总结

Git在本地进行版本控制分为以下步骤:

新建版本库
add commit实现版本添加
reset实现版本回溯
checkout reset撤销工作区、暂存区操作
rm 删除操作

log reflog查看版本一览、历史版本信息
status查看Git状态

4. 参考