• 如何用 Git 将代码恢复到一个历史的版本 不及格的程序员


     


    如何用 Git 将代码恢复到一个历史的版本

     发表于 2016-08-06 17:39

    文章目录
    1. 1. 需求
    2. 2. 暴力的方式
    3. 3. 温和的方式

    需求

    有些时候,在一些特殊情况下,我们需要将代码恢复到一个历史的提交版本上。而这个历史提交版本,离最新的提交已经比较久远了。

    比如,我希望将如下的仓库的提交,恢复到上上上上次提交。当然,我可以一次一次的 revert,但是有没有更快更简单的办法呢?

    暴力的方式

    如果你的仓库是自己在用(不影响别人),那么你可以使用 git reset --hard <target_commit_id> 来恢复到指定的提交,再用 git push -f 来强制更新远程的分支指针。为了保证万一需要找回历史提交,我们可以先打一个 tag 来备份。

    对于刚刚的例子,需要执行的命令就是:

    // 备份当前的分支到 backup_commit
    git tag backup_commit
    git push origin backup_commit
    // 重置 source 分支
    git reset --hard 23801b2
    // 强制 push 更新远程分支
    git push origin source -f

    温和的方式

    如果你的仓库是多人在协作,那么你这么操作会使用别人本地的代码库混乱,所以只能建一个新的提交,这个新的提交中把想取消的提交都 revert 掉,那么具体应该如何做呢?方法如下:

    首先,和刚刚一样,用 git reset --hard 23801b2 将代码切换到目标提交的 id。接下来,用 git reset --soft origin/source 命令,将当前代码切换回最新的提交。

    执行完上面两步后,你的仓库还是最新的提交,但是工作区变成了历史的提交内容,这个时候用 git add 和 git commit 即可。最终完成的效果如下:

    不过经过念茜的提醒,该方法需要保证 reset 的时候没有别人做新的提交,如果有的话,会一并把别人的提交也撤销了。所以还是挺危险的,慎用。

    虽然用到的时候很少,但是理解它的原理有助于大家理解 Git 的工作区,暂存区和版本库的各种指针操作的意义,希望对大家有用。

     
    【学了就忘】Git后悔药 — 35.reset版本回退总结
    播报文章

    高级互联网专家

    2021-07-18 15:15工具主管
    关注

    在Git中进行版本回退需要使用git reset命令。

    以前面文章中的事例为例,当我准备在V4版本,回退到V3版本的时候,分支中的提交和工作目录中文件的状态如下图:


     

    我们分别执行了三种回退方式:

    • git reset --soft HEAD^:温柔的回退。

    • git reset --mixed HEAD^:中等回退。

    • git reset --hard HEAD^:强硬的回退。

    (我们从英文中就可以看出,一个比一个回退的多。)

    下面我们一一进行总结。

    1、git reset --soft回退

    当我在V4版本的时候,执行命令回退到V3版本。

    Git中发生的变化如下图:

     

    依据上图,理解一下发生的事情:本质上就发生了,把HEAD指针指向了V3版本。而工作区和暂存区中的readme.txt文件是没有做任何变动的。

    所以你查看本地版本库中的文件是V3版本,工作区和暂存区中的文件是V4版本。

    就等于回滚到了git commit之前的状态。

    (我前面文章中有详细的演示)

    拓展:

    当我继续修改文件之后,再次提交,会在V3版本之上再创建一个新的commit提交,并移动HEAD指针指向的分支来使其指向该commit提交,这样依次提交下去,如下图:

     

    如果我们使用git log命令查看本地版本库的历史提交信息的时候,就不会出现V4版本提交的信息。会是V1V2V3V5。(我们从前面文章中已经演示了)

    但是V4版本是不会在Git中删除的,会永远的存储在Git的本地版本库中。我们可以使用git reflog命令,可以查看该V4版本的提交信息。

    提示:只要是本地版本库中HEAD有过的变化,那么命令就能够显示出来。

    (关于这点,下面同理,所以下面就不说了。)

    2、git reset --mixed命令

    命令回退到V3版本。

     

    理解一下发生的事情,我们可以看到上图中,完成了两步操作:

    1. 把HEAD指针指向了V3版本(也就是版本库回退了)。

    2. 把暂存区中的文件也回退到了V3版本。

    而只有工作区中的文件内容没有变化。

    这说明命令比命令,多回退了暂存区中的内容。

    就等于回滚到了git add之前的状态。

    提示:因为--mixed参数是命令的默认选项,也就是不写任何参数就默认使用参数。即git reset HEAD^等同于命令

    3、git reset --hard命令

    命令回退到V3版本。

     

    理解一下发生的事情,我们可以看到上图中,完成了三步操作:

    1. 把暂存区中的

    2. 把工作区中文件的修改也复原了。

    所以执行完命令,是完全回退一个版本。

    此时工作区、暂存区、本地版本库中的文件状态都是一致的,都是V3版本。

    就等于回滚了一个“编辑文件,添加到暂存区,提交版本库”的整个流程。

    4、注意点

    必须注意,--hard参数是命令唯一的危险用法,是能够使Git会真正地销毁数据的仅有的几个操作之一。

    其他任何形式的操作都可以轻松撤销,但是选项不能,因为它强制覆盖了工作目录中的文件。

    在这种特殊情况下,我们的Git数据库中的一个提交内,还留有该文件的v4版本,我们可以通过来找回它。但是若该文件还未提交,Git仍会覆盖它从而导致无法恢复。

  • 相关阅读:
    【Android游戏开发之八】游戏中添加音频详解MediaPlayer与SoundPool的利弊以及各个在游戏中的用途!
    【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
    【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!
    前端要给力之:URL应该有多长?
    【Android游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder!!
    charactersFound方法中的陷阱
    前端要给力之:分解对象构造过程new()
    结合UIImageView实现图片的移动和缩放
    【Android游戏开发之一】设置全屏以及绘画简单的图形
    扩展BaseAdapter实现在ListView中浏览文件
  • 原文地址:https://www.cnblogs.com/ioriwellings/p/5958377.html
Copyright © 2020-2023  润新知