git status
可以让我们时刻掌握仓库当前的状态
git diff
是查看difference,显示的格式正是Unix通用的diff格式
输出如下:
On branch master 在分支主机上
Changes to be committed: 要提交的更改
提交修改和提交新文件是一样的两步,第一步是:git add
git add readme.txt
下一步,就可以放心地提交了:
$ git commit -m "add distributed"
输出如下:
[master b55662a] add distributed
1 file changed, 4 insertions(+), 2 deletions(-)
添加文件r.txt
Git is a version control system.
Git is free software.
首次提交
git add r.txt
git commit -m "wrote a readme file"
第一次修改
Git is a distributed version control system.
Git is free software.
第二次提交:
git add r.txt
git commit -m "add distributed"
第二次修改
Git is a distributed version control system.
Git is free software distributed under the GPL.
第三次提交
git add r.txt
git commit -m "append GPL"
当觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
git log
命令显示从最近到最远的提交日志
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
git log --pretty=oneline
看到的一大串类似1094adb...
的是commit id
(版本号)
Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
现在我们启动时光穿梭机,准备把readme.txt
回退到上一个版本
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
现在要把当前版本append GPL
回退到上一个版本add distributed
,就可以使用git reset
命令:
输入:
git reset --hard HEAD^
输出如下:
HEAD is now at c7cda95 add distributed
看看readme.txt
的内容是不是版本add distributed
:
输入如下:
cat readme.txt
输出如下:
Git is a distributed version control system.
Git is free software.
根据上述结果可知,确实还原了
但是此时注意,回退到上一版本以后,上一版本成为了当前版本,也就是最新版本,之前的版本信息就会丢失,要想找回,只能是在未关闭窗口的情况下去一条命令一条命令地去看,能不能找到看你自己。
如果找到了那个append GPL
的commit id
是1094adb...
,于是就可以指定回到未来的某个版本:
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
:
┌────┐
│HEAD│
└────┘
│
└──> ○ append GPL
│
○ add distributed
│
○ wrote a readme file
改为指向add distributed
:
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──> ○ add distributed
│
○ wrote a readme file
然后顺便把工作区的文件更新了。所以想让HEAD指向哪个版本号,就把当前版本定位在哪
当用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
git reflog
小结
现在总结一下:
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。