zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    vim 显示行号 临时&永久
    ubuntu redis config IP password
    Vulnerability Scanning Tools
    Tomcat清理无用应用防止漏洞
    XSS平台-学习
    Amazon aws s3 加速
    XSS的DOS攻击之 server limit dos
    Linux Nginx naxsi
    Acunetix Web Vulnerability Scanner abbr. AWVS
    nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)
  • 原文地址:https://www.cnblogs.com/bocurry/p/7751021.html
Copyright © 2011-2022 走看看