Git撤回操作之二

      之前一篇文章已经介绍过了一种撤回的方式,是针对还没有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等,但是用的不多,这里就不讲了。

 参考文献:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000/

                   http://www.yiibai.com/git/git_fix_mistakes.html#article-start

原文地址:https://www.cnblogs.com/bocurry/p/7751021.html