时间机器

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

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

git log,增加了一条纪录:

  1. commit d9b03125921d20482937f43ea0bdbfbfb7fe1745
  2. Author: kardinal <2999am@gmail.com>
  3. Date: Wed Nov 5 15:18:49 2008 +0800
  4. 意外改动

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

  1. git reset HEAD^
  2. git log
  3. git diff

1

git reset默认使用—mixed选项

2

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

3

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

4

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

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

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

1

再一次将这些改变提交

2

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

3

版本纪录中已取消该版本

4

改动纪录中没有任何内容

5

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

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

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

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

1

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

2

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

3

版本纪录中已取消该版本

4

没有任何改动纪录待提交

5

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

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