10.3 恢复删除的文件

经过了上面的文件删除,工作区已经没有文件了。为了说明文件移动,现在恢复一个删除的文件。前面已经说过执行了文件删除并提交,只是在最新的提交中删除了文件,历史提交中文件仍然保留,可以从历史提交中提取文件。执行下面的命令可以从历史(前一次提交)中恢复welcome.txt文件。


$git cat-file-p HEAD~1:welcome.txt>welcome.txt


也可以使用git show命令取代git cat-file-p命令,效果相同。


$git show HEAD~1:welcome.txt>welcome.txt


使用git checkout命令则最为简洁实用。


$git checkout HEAD~1—welcome.txt


上面的命令中出现的HEAD~1即相当于HEAD^都指的是HEAD的上一次提交。执行git add-A命令会将工作区中的所有改动及新增文件添加到暂存区,这也是一个常用的技巧。执行下面的命令后,将恢复过来的welcome.txt文件添加回暂存区。


$git add-A

$git status-s

A welcome.txt


执行提交操作,文件welcome.txt又回来了。


$git commit-m "restore file:welcome.txt"

[master 63992f0]restore file:welcome.txt

1 files changed,2 insertions(+),0 deletions(-)

create mode 100644 welcome.txt


通过再次添加的方式恢复被删除的文件是最自然的恢复方法。其他版本控制系统如CVS也采用同样的方法恢复删除的文件,但是有的版本控制系统(如Subversion)如果这样操作会有严重的副作用——文件变更历史被人为地割裂,而且还会造成服务器存储空间的浪费。Git通过添加方式反删除文件没有副作用,这是因为在Git的版本库中相同内容的文件保存在一个blob对象中,即便是内容不同的blob对象通过对象库打包也会进行存储优化。