之前一篇文章已经介绍过了一种撤回的方式,是针对还没有commit到working directory的。这一篇是介绍已经commit之后的撤回方法。上一篇的地址:http://www.cnblogs.com/bocurry/p/7742259.html
二、commit之后的撤回
使用reset --hard + 指定版本即可恢复。以下是整个恢复过程。
a.查看文件,删除掉3.txt。
$ git rm 3.txt rm '3.txt' $ git commit -m"delete 3.txt" [dev 37e7ea0] delete 3.txt 1 file changed, 1 deletion(-) delete mode 100644 3.txt $ ls 2.txt README.md README.txt dev.txt
可以看到3.txt文件已经被删除了。
b.使用命令git reset --hard HEAD^回到上一个版本
$ git reset --hard HEAD^ HEAD is now at 60be457 delete the second line $ ls 2.txt 3.txt README.md README.txt dev.txt $ git status # On branch dev # Your branch is ahead of 'origin/dev' by 2 commits. # (use "git push" to publish your local commits) # nothing to commit, working directory clean
其实Git中有一个HEAD指针是指向目前所在的版本的。HEAD^就表示上一个版本,在这里也就是3.txt未删除前的版本。如果是要回到再上一个版本,可以用HEAD^^。但如果是回到之前很久的版本岂不是要有很多个"^"?Git这么智能的东西,肯定不会有这么傻的设置,肯定会有更加好用的方式。接下来就介绍怎么“回到过去”。
上面的撤回是用HEAD^表示上一个版本号。那如果我们想要获取之前的版本号就得使用log命令。
$ git log commit 60be457e66a8db8c8288f27965234b82a3a91f92 Merge: e416f28 c4badb7 Author: yuanchengbo <yuanchengbo@csair.com> Date: Thu Oct 26 18:35:49 2017 +0800 delete the second line commit e416f28b0d381ea0aada802397f030ebc0b03483 Author: yuanchengbo <yuanchengbo@csair.com> Date: Thu Oct 26 18:21:29 2017 +0800 add something new in 2.txt
这里是截取的靠上的两条log。commit后的那串60be.......代表是的提交的ID。最下面的那条“delete the second line”是当时commit的时候的消息。
因此要回到e416f这个状态,可以使用命令git reset --hard e416f (不用填完,Git会自动去查找的)。
通过log可以看到已经回到了e416f,并且log记录也回到了这个状态的时候,那么怎么“回到未来”呢?
$ git reset --hard e416f28b0d381e HEAD is now at e416f28 add something new in 2.txt $ git log commit e416f28b0d381ea0aada802397f030ebc0b03483 Author: yuanchengbo <yuanchengbo@csair.com> Date: Thu Oct 26 18:21:29 2017 +0800 add something new in 2.txt commit 064968ee7dccfe56378b4b25ed02a3f7eea6a4b8 Author: yuanchengbo <yuanchengbo@csair.com> Date: Thu Oct 26 15:38:06 2017 +0800 add dev.txt in dev
接下来将介绍“回到未来”的方法。有什么方法可以获取有史以来所有的log呢?--使用reflog命令
$ git reflog e416f28 HEAD@{0}: reset: moving to e416f28b0d381e 60be457 HEAD@{1}: reset: moving to 60be c4badb7 HEAD@{2}: reset: moving to c4badb70d6ec47f967e5a1e01a76011dfd800b58 60be457 HEAD@{3}: reset: moving to HEAD^ 37e7ea0 HEAD@{4}: commit: delete 3.txt 60be457 HEAD@{5}: reset: moving to head^
可以看到上面也记录了仓库建立以来的所有记录(这里只是截取了一部分)。前面的那串e416f28代表的是提交ID,后面HEAD@{0}指的是HEAD指针的位置。{0}表示当前的指针。后面的reset: moving to e416f28b0d381e表示的是log记录。
上图反映的就是我们这次reset操作,其实我们就是将HEAD这个指针移到了commit ID指定的位置。然后工作区(working directory)也相应的回到那个时候。其实与其说是撤回,不如说是去到了那个版本,只要我们找到了对应的commit id。
由此,我们知道了Git中所有的撤回方法。当然,这篇帖子中的--hard是一个属性,还有--soft以及--mix等,但是用的不多,这里就不讲了。
http://www.yiibai.com/git/git_fix_mistakes.html#article-start