初始版本
首先,在一个自定义的位置,创建目录a,比如在D盘下
[注意]本文会用到一些常用的Linux的Shell命令
先使用cd d:命令,切换到d盘,然后使用mkdir a命令,在d盘下新建一个名称为a的文件夹。最后,使用ls命令,查看d盘下的所有文件及文件夹,发现a是存在的,所以操作成功
![](https://i-blog.csdnimg.cn/blog_migrate/e788aa014d531c8405ceaf8f7453f20b.png)
然后,使用cd a命令,进入d盘下的a文件夹
![](https://i-blog.csdnimg.cn/blog_migrate/a907163c4baf56c6b98c82e1c94a25db.png)
接下来,使用git init命令,初始化一个Git仓库。创建仓库的本质就是在当前文件夹下创建一个.git文件夹
![](https://i-blog.csdnimg.cn/blog_migrate/f990e65e8d24177b0972df30ae0596bc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/04da95653603275c8adfa3a1c2351b8c.png)
然后使用git status命令,查看当前的文件状态
![](https://i-blog.csdnimg.cn/blog_migrate/37e0bc18a970cc65c93dd89de2b1ffb4.png)
接下来,在a文件夹下,使用touch 1.txt命令,新建一个1.txt文本文件,再使用git status命令,查看当前的文件状态。在状态报告中可以看到新建的1.txt文件出现在“Untracked files”下面,表示该文件为未跟踪的文件
![](https://i-blog.csdnimg.cn/blog_migrate/33114322b1f7828169ccde1b6e684b98.png)
接着,使用git add 1.txt命令,跟踪该文件。此时再运行git status命令,会看到1.txt文件已被跟踪,并处于暂存状态。只要在“Changes to be committed”这行下面的,就说明是已暂存状态
![](https://i-blog.csdnimg.cn/blog_migrate/4f3d15736d58ba3e83dd4dbc3131959a.png)
再运行提交命令git commit -m 'add 1.txt',提交文件1.txt。提交后它会提示,当前是在哪个分支(master)提交的,本次提交的完整SHA-1校验和是什么(beac21a),以及在本次提交中,有1个文件修订过,0行添改,0行删改过
再运行命令git status时,因为文件已经被提交了,所以提示没有什么可供提交的了,工作目录很干净
![](https://i-blog.csdnimg.cn/blog_migrate/d78f3aec9a153642f9398c2bdd44f7e5.png)
新版本
接下来,我们使用cat > 1.txt命令,将1.txt文件的内容从无内容修改为'1'。使用git status时,提示当前文件没有放置在暂存区
![](https://i-blog.csdnimg.cn/blog_migrate/310c5e40b6e94a0cc7116044e67e586d.png)
使用git add 1.txt命令,放置在暂存区,再使用git status时,提示1.txt文件已被跟踪,并处于暂存状态
![](https://i-blog.csdnimg.cn/blog_migrate/f5afb9456a920d7cbe93bc8e145c4c21.png)
使用git commit -m 'alter to 1'命令,来提交文件1.txt。提交后它会提示,本次提交的完整SHA-1校验和是f73e651,以及在本次提交中,有1个文件修订过,1行添改过
![](https://i-blog.csdnimg.cn/blog_migrate/65cf5c4241ece024452545f39f1422f3.png)
接下来,照猫画虎,创建1.txt的第三个版本,将其内容修改为'2'并提交。本次提交的完整SHA-1校验和是74833f8,以及在本次提交中,有1个文件修订过,1行添改过、1行删改过
![](https://i-blog.csdnimg.cn/blog_migrate/e3be77d2bba570f94783bd6232e430f0.png)
查看版本
现在,我们总共把三个版本的1.txt文件提交到Git仓库中了
版本1:空内容 版本2:'1' 版本3:'2'
当然了,在实际工作中,我们处理的文件比较复杂,并不能记得每次都改了什么内容。在Git中,我们用git log命令查看提交历史
git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是alter t0 2,上一次是alter to 1,最早的一次是add 1.txt
![](https://i-blog.csdnimg.cn/blog_migrate/b56963b65288bdf6d3e25dc6ed5e2ca6.png)
如果嫌输出信息太多,可以加上--pretty=oneline参数
![](https://i-blog.csdnimg.cn/blog_migrate/9798e1354088c93423b3f6717fb0a85f.png)
git log有许多选项,下表列出了一些常用的选项及其释义
选项 说明 -p 按补丁格式显示每个更新之间的差异 --word-diff 按 word diff 格式显示差异 --stat 显示每次更新的文件修改统计信息 --shortstat 只显示 --stat 中最后的行数修改添加移除统计 --name-only 仅在提交信息后显示已修改的文件清单 --name-status 显示新增、修改、删除的文件清单 --abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符 --relative-date 使用较短的相对时间显示(比如,“2 weeks ago”) --graph 显示 ASCII 图形表示的分支合并历史 --pretty 使用其他格式显示历史提交信息可用的选项包括oneline,short,full,fuller 和format(后跟指定格式) --oneline `--pretty=oneline --abbrev-commit` 的简化用法
我们常用-p选项展开显示每次提交的内容差异。可以看到,最近一次更新和上一次更新的区别是将1修改为2。上一次和上上一次更新的区别是从空内容变成内容为1
![](https://i-blog.csdnimg.cn/blog_migrate/62abf9016cccc48d8f542ac89217edb4.png)
有时候图形化工具更容易展示历史提交的变化,随Git一同发布的gitk就是这样一种工具。它是用Tcl/Tk写成的,基本上相当于git log命令的可视化版本,凡是git log可以用的选项也都能用在gitk上。在项目工作目录中输入gitk命令后,就会启动下图所示的界面
![](https://i-blog.csdnimg.cn/blog_migrate/d7c6ddb18f298490845060da815330ee.png)
版本切换
现在,我们准备把1.txt回退到上一个版本,也就是内容为'1'的那个版本
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交(74833f8172d219dbf755dff7cdc64356bff39aad),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
现在,我们要把当前版本“alter to 2”回退到上一个版本“alter to 1”,就可以使用git reset命令
首先,使用cat 1.txt命令查看该文件的内容为'2',接着使用命令git reset --hard HEAD^,将文件返回到上一个版本,再使用cat 1.txt命令查看该文件的内容为'1'
![](https://i-blog.csdnimg.cn/blog_migrate/f19ea9b049dda6b7fb4bd1b7c4404db5.png)
我们用git log再看看现在版本库的状态,发现最新的那个版本“alter to 2”已经看不到了
![](https://i-blog.csdnimg.cn/blog_migrate/5ef0933f694d15b55339621b5621cae9.png)
如果想返回到最新的版本,可以使用命令git reset --hard commit_id来实现
但是,如果找到最新版本的1.txt的commit id呢?Git提供了一个命令git reflog,该命令按照之前经过的所有的commit路径按序来排列,用来记录你的每一次命令
![](https://i-blog.csdnimg.cn/blog_migrate/110fbafbd03ee312cf892548eb0fb5d5.png)
从git reflog命令返回的结果中发现,第五行的beac21a是上上个版本的1.txt文件的是commit id,第四行的f73e651是上个版本的,第三行的74833f8就是最新版本的
下面使用git reset命令,将文件恢复到最新版本
![](https://i-blog.csdnimg.cn/blog_migrate/e5bf229bb7b1ecf763ad6cc882890e58.png)