美文网首页L_Git开发环境ios
Git后悔药之代码回退

Git后悔药之代码回退

作者: Sunny旋律 | 来源:发表于2016-08-25 16:06 被阅读7503次

    1、撤销操作

    git.png

    一来就是一张大图,如果不太了解git的人会有点蒙,下面简单解释一下(都是我个人的理解,如果不妥还请指正),git仓库的初始化以及clone这些在这里就不讲了,请自行百度。

    远程仓库:就是在github或者在gitlab上的代码。可以用git pullgit push来进行本地仓库和远程仓库的同步操作。

    版本库:每一次的commit都会生成一个记录,每个记录都有一个hash值来唯一标识,很多很多的commit就形成了版本库。为什么图上有两个版本库?那是因为上面那个版本库是commit前,下面那个版本库是commit后。

    工作区:当我们把远程仓库的代码clone下来后,一般会默认在分支master上,此时,该分支的所有代码都在本地,这就是当前的工作区,以后的每一次commit都会在这个分支上记录。

    暂存区:这个应该大家最容易理解错的,也是用习惯了svn的朋友最不理解的地方。每次修改了代码后,都需要用git add来讲工作区的修改记录到暂存区,然后我们再用git commit来讲暂存区的内容提交到版本库,当然这里也可以用git commit -a命令一步到位

    上面这张图就简单描述了我们每次的修改,用什么命令流转到什么区的一个示意图。

    2、版本回退

    前提条件:已经执行git commit命令了,但是没有push到远程仓库,用以下命令可以回退

    git reset --hard HEAD^
    

    上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100其实这个回退就是将本地的HEAD指针移动到某个版本上而已,所以这个操作是非常快的。

    git log    [查看commit记录]
    //这个3628164 是一个commit版本号,可以指定回退到那个版本
    git reset --hard 3628164 
    

    查看提交记录,也能看到每一次提交的版本号,这是一个很长的哈希值,这个时候我们通过这个版本号可以指定回退到某个版本上,用这个版本号的时候可以只用它前面几位,具体几位看你心情咯,只要能唯一标识这个版本就ok。

    git reflog [查看本地会影响HEAD指针的命令操作记录,这个不会同步到远程仓库]
    

    强调一下,注意这里是记录的会影响HEAD指针的操作记录。
    简单举例说一下这个git reflog的使用场景。git reflog
    假如当前我有三次提交,再假设三次提交的版本号分别为commitnum1,commitnum2,commitnum3,并且我当前处于commitnum3这个版本上(也就是HEAD指向了commitnum3),这个时候我用命令git reset --hard commitnum2就回退到了comminum2了,好,问题来了,如果突然又想回到commitnum3怎么办呢,当然你可以翻看上去看记录,那个版本号还能看到,但是如果这是第二天了,已经翻不上去了就麻烦了,这个时候git reflog就出场啦,他可以看到你昨天执行git reset --hard commitnum2命令的时候的所在版本号,这个时候就可以用git reset --hard commitnum3来恢复回去。

    git_reflog.png

    这个结果分三部分,前面黄色的文字就是执行那次命令时所在的版本号,中间的HEAD@[0]是就是HEAD指针变更记录,最后面就是那次命令所做的事情。

    最后再啰嗦一点,如果这些commit都还没有同步到远程仓库,你reset后那些commit记录是不会被同步上去的。但是,如果已经同步上去了,就算你本地reset了,虽然本地工作区内容变成了你想要的了,但是记录就抹不去了。

    参考:
    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

    相关文章

      网友评论

      • 072affb5bd91:评论区不能贴图片,我想请教一下楼主,reflog里面多个HEAD->master代表啥意思,提问链接是https://segmentfault.com/q/1010000016591925
        Sunny旋律:HEAD你理解为一个指针,代表当前指向的是哪个分支或者哪一个commit
      • 红叶XI:学习了:
        1.git reset --hard HEAD^

        话说 git reset --hard 3628164 是什么鬼?

        2.git reflog
        红叶XI:@Sunny玄子 可以 很强
        Sunny旋律:@HappyGui
        1、那一串数字其实是commit的版本号,取前几位只要能唯一标识就ok,就是说回退到那一次的commit。
        2、git reflog就是查看本地的会影响HEAD指针变更的命令操作记录,每执行一次相关命令就会记录一次,并且记录你那次命令执行时所在的版本号。
        感谢你的阅读和提问,针对你的提问我重新丰富了一下这方面的内容,你可以再看一下,如果有不清楚的地方,欢迎再提问
        Syuusuke:@HappyGui commit的Id
      • hainuo:讲的很好
        Sunny旋律:@hainuo 谢谢

      本文标题:Git后悔药之代码回退

      本文链接:https://www.haomeiwen.com/subject/gvlasttx.html