git reflog and checkout

用错checkout 了比如想checkout出下面的一个版本,结果用错了

git checkout  8bfd9b1d292 这样会导致HEAD  deatched ,在这个地方修改后commit  

commit 8bfd9b1d2922b55586f41d37f1a2a992d580e1dd Author: lab <lab@dera.com.cn> Date:   Tue Dec 8 20:21:42 2015 +0800

    update main.c

当git checkout master  时 刚的8bfd9b1d292 分支就丢了。

 

可以用下面方法找回

git reflog

c65ec9a HEAD@{0}: checkout: moving from 68657499e57fdcd970f9207ac2cb0f656d3bd5b6 to master
8bfd9b1d292 HEAD@{1}: checkout: moving from master to

 

git reset --hard 8bfd9b1d292 后可以将恢复

 

 

恢复 git reset -hard 的误操作 

转帖:http://hi.baidu.com/configuration/item/97fddeea252818d0eb34c964

有时候使用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天以后。

 How to checkout only one file from git repository ?
http://stackoverflow.com/questions/2466735/how-to-checkout-only-one-file-from-git-repository/2467629#2467629
 
posted @ 2015-12-14 19:50  fastwave2004  阅读(442)  评论(0编辑  收藏  举报