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对象通过对象库打包也会进行存储优化。