时间机器

test文件中随意改动,然后提交

git commit -a -m "意外改动"  

git log,增加了一条纪录:

commit d9b03125921d20482937f43ea0bdbfbfb7fe1745
Author: kardinal <2999am@gmail.com>
Date:   Wed Nov 5 15:18:49 2008 +0800

    意外改动  

使用git reset命令回溯到历史版本:

git reset1 HEAD^2  
git log3
git diff4  

1

git reset默认使用--mixed选项

2

HEAD表示当前版本,HEAD^表示前一个版本,HEAD^^表示前两个版本,HEAD~4表示前四个版本;也可以使用“版本标签”或“版本ID”来指定版本(只要前几位就可以了)

3

可以看到版本纪录中最后一次提交已经取消

4

可以看到,--mixed选项回溯到提交到索引之前的状态

git reset --soft回溯到已提交到索引但未提交到版本库的状态

git commit -a -m "意外改动"1
git reset --soft HEAD^  2
git log 3
git diff 4
git diff --cached 5 

1

再一次将这些改变提交

2

使用--soft选项回溯到上一版本

3

版本纪录中已取消该版本

4

改动纪录中没有任何内容

5

改动已被提交到索引,但是未提交到版本库,所以缓存的改动纪录还可以查看
[注意] 注意

git reset 回溯到git add之前的状态;git reset --soft回溯到git add之后的状态

以上方法回溯到历史版本,只是回溯版本库和索引的纪录,而文件的内容并不会回溯到之前的状态,使用git reset --hard命令,将文件内容也一同回溯

git commit -a -m "意外改动"1
git reset --hard HEAD^  2
git log 3
git diff --cached 4 
cat test5  

1

……还得提交一次,谁让它是“意外改动”

2

使用--hard选项回溯到上一版本

3

版本纪录中已取消该版本

4

没有任何改动纪录待提交

5

文件内容回溯到上一版本的状态

--hard选项存在一定风险,因为很多情况下,你不能确定内容算不算“意外改动”。这时,可以新建一个分支,在这个分支中进行回溯,处理完成后合并两个分支,参见“分支管理”一节