美文网首页RecyclerView
如何撤销 Git reset重置(How can I undo

如何撤销 Git reset重置(How can I undo

作者: 黄嵘才 | 来源:发表于2016-10-16 12:26 被阅读2599次

    如何撤销 Git重置

    How can I undo git reset --hard HEAD~1?
    要了解可不可撤销Git的操作,那就需要先了解是如何进行的。


    Git reset命令用于将当前分支回退到指定的某个版本。

    git reset [--soft | --mixed | --hard] [commitversion]

    git reset --hard HEAD~1
    

    配图

    reset

    reset命令可以看做commit命令的取反操作,既然可以向前提交,当然也可以向后回滚。
    可以像事务一样回滚一次到上一次的位置,也可以回滚到指定的位置。
    这个位置由commitversion决定,每commit一次都会产生一个commitversion值。

    1 --soft,--mixed,--hard这几个选项会改变reset命令的行为模式:配图说明三个区
    --hard
    --hard选项在帮助文档中的解释是:

    • Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.

    具体来说会执行三个动作:
    (1) 替换引用的指向。引用指向新的提交ID。
    (2) 替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。
    (3) 替换工作区。替换后,工作区的内容变得和暂存区一致,也和commitversion所指向的目录树内容相同。
    --soft
    --soft选项只更改引用的指向,不改变暂存区和工作区。
    --mixed(默认)
    --mixed那么当前分支被回滚到指定commitversion,暂存区被重置,但是工作区文件不变。

    2 commitversion是指定曾经commit的版本,每次commit都会产生唯一一个commitversion,用于标识本次commit。
    (1) 那么怎样找到每次commit的commitversion呢?
    有两个命令都可以达到这个目标:git log 和git reflog。
    :配图说明怎么获取log

    git log [--pretty=oneline]
    git reflog

    //用例
    用法分别是:
    git log查看的日志是相对于当前commitversion之前的所有历史日志,
    git reflog查看的日志是相对于最后一个commitversion之前的所有历史日志。
    展开来讲就是,一个是相对历史日志,一个是绝对历史日志。假如你已经reset到某个commitversion了,那么这个时候使用git log只能看到这个commitversion之前的历史日志,看不到之后的历史日志了,但是使用git reflog就可以。

    (2) git对离当前版本最近的commitversion提供了快捷方式。
    在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。

    比如撤销到上一个版本:

    git reset --hard HEAD^
    

    或者

    git reset --hard HEAD~1
    

    比如恢复撤销到上一本版本:

    git reset --hard HEAD@{1}
    

    (3) 如果省略commitversion,相当于指定最新版本HEAD,即git reset == git reset --mixed HEAD。引用被指向最新提交版本即HEAD,相当于不改变引用位置;暂存区被替换为最新的HEAD的目录树,相当于当前已add或rm但是未commit的改动被撤出暂存区,可以看做git add的取反操作。

    扩展用法

    有时工作空间的工程会由开发工具产生一些最新的文件或目录,这些文件或目录是不纳入git版本管理范围内的,所以对于电脑当前的工作空间,有时使用git reset命令在某些操作系统上不一定能完全回退,需要一个额外的操作帮助git回退,这个命令是:

    git clean -dfx
    

    用于强制清洗当前工作区不受git管理的文件或目录,帮助git将当前工作区干净的回退到指定commitversion。

    悬挂提交 也就是说,这个提交没有任何分支指向它。配图说明
    下次Git执行垃圾回收的时候,git会发现这个提交没有被跟踪,将会删除它。

    撤销与恢复

    :配图操作
    后撤

    git reset --hard HEAD~1
    

    恢复

    git reset --hard HEAD@{1}
    

    HEAD@{1} 指代码的是前一次操作
    花了我一段时间去理解HEAD@{1}和HEAD~1之间的差异是 前一个版本和后一个版本
    这样你可以轻松的前一步,后一步的操作了而不必记得具体的SHA1
    这个值你可以在LOG输出里看到

    Git在线学习
    另外推存一个GIT学习的小游戏吧。通过完成学习,任务。轻松掌握各Git操作技能。

    相关文章

      网友评论

        本文标题:如何撤销 Git reset重置(How can I undo

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