恢复git撤销commit的代码

使用git reset --hard 是将磁盘文件也删除git

时候使用Git工做得当心翼翼,特别是涉及到一些高级操做,例如 reset, rebase 和 merge。甚至一些很小的操做,例如删除一个分支,我都担忧数据丢失。

不 久以前,我在作一些大动做(rebasing)以前,我老是备份整个版本库,以防万一。直到最近我才发现git的历史记录是不可修改的,也就是说你不能更 改任何已经发生的事情。你作的任何操做都只是在原来的操做上修改。也就是说,即便你删除了一个分支,修改了一个提交,或者强制重置,你仍然能够回滚这些操 做。

让咱们来看一些例子:

$ git init
$ touch foo.txt
$ git add foo.txt
$ git commit -m "initial commit"

$ echo 'new data' >> foo.txt
$ git commit -a -m "more stuff added to foo"

你如今看git的历史记录,你能够看到两次提交:
$ git log
* 98abc5a (HEAD, master) more stuff added to foo
* b7057a9 initial commit

如今让咱们来重置回第一次提交的状态:
$ git reset --hard b7057a9
$ git log
* b7057a9 (HEAD, master) initial commit

这看起来咱们是丢掉了咱们第二次的提交,没有办法找回来了。可是 reflog 就是用来解决这个问题的。简单的说,它会记录全部HEAD的历史,也就是说当你作 reset,checkout等操做的时候,这些操做会被记录在reflog中。

$ git reflog
b7057a9 HEAD@{0}: reset: moving to b7057a9
98abc5a HEAD@{1}: commit: more stuff added to foo
b7057a9 HEAD@{2}: commit (initial): initial commit

因此,咱们要找回咱们第二commit,只须要作以下操做:
$ git reset --hard 98abc5a

再来看一下 git 记录:
$ git log
* 98abc5a (HEAD, master) more stuff added to foo
* b7057a9 initial commit

因此,若是你由于reset等操做丢失一个提交的时候,你老是能够把它找回来。除非你的操做已经被git当作垃圾处理掉了,通常是30天之后。it

相关文章
相关标签/搜索