git status
我们已经成功地添加并提交了一个readme.txt
文件,现在,是时候继续工作了,于是,我们继续修改readme.txt
文件,随意更改一下里面的内容,然后运行git status
命令查看结果:
1 | $ git status |
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。
git diff
虽然Git告诉我们readme.txt
被修改了,但如果能看看具体修改了什么内容,自然是很好的。所以,需要用git diff
这个命令看看:
1 | $ git diff readme.txt |
git diff
顾名思义就是查看difference,显示的格式正是Unix
通用的diff
格式,可以从上面的命令输出看到,我们添加的一条信息“2.看看git status命令的结果”。
知道了对readme.txt
作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add
:
1 | $ git add readme.txt |
同样没有任何输出。在执行第二步git commit
之前,我们再运行git status
看看当前仓库的状态:
1 | $ git status |
git status
告诉我们,将要被提交的修改包括readme.txt
,下一步,就可以放心地提交了:
1 | $ git commit -m "添加了一条信息" |
提交后,我们再用git status
命令看看仓库的当前状态:
1 | $ git status |
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。
版本回退
现在,我们已经学会了修改文件,然后把修改后的文件提交到Git版本库。再练习一次,修改readme.txt
文件中的内容然后尝试提交。
1 | $ git add readme.txt |
像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
现在,我们回顾一下readme.txt
文件一共有几个版本被提交到Git仓库里了:
版本1: 第一次使用add和commit提交文件
1 | 1.git学习。初步 |
版本2: 添加了一条信息
1 | 1.git学习。初步 |
版本3: 添加了第3条信息
1 | 1.git学习。初步 |
当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log
命令查看:
1 | $ git log |
git log
命令显示从最近到最远的提交日志,我们可以看到3次提交。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
1 | $ git log --pretty=oneline |
好了,现在我们准备把readme.txt
回退到上一个版本,也就是“添加了一条信息”的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交6256515d442222716889c134209ec551ec4b1c...
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
现在,我们要把当前版本“添加了第3条信息”回退到上一个版本“添加了一条信息”,就可以使用git reset
命令:
1 | $ git reset --hard HEAD^ |
此时便回到了该版本:
1 | $ cat readme.txt |
如果想再次回到最新的版本(“添加了第三条信息”),可以先使用命令git reflog
查看命令历史,以便确定要回到未来的哪个版本。
1 | $ git reflog |
然后再次使用git reset --hard commit_id
命令在版本的历史之间穿梭
1 | $ git reset --hard 6256515 |
小结
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。