• 【DevOps】Git 图文详解(八):后悔药 - 撤销变更


    发现写错了要回退怎么办?看看下面几种后悔指令吧!

    • ❓ 还没提交的怎么撤销? —— checkoutreset
      • 还未提交的修改(工作区、暂存区)不想要了,用签出指令(checkout)进行撤销清除。
      • 或者用 checkout 的新版回滚指令 reset
    • ❓ 已提交但没有 push 的提交如何撤销?—— resetrevert
    • ❓ 已 push 的提交如何撤销?—— 同上,先本地撤销,然后强制推送 git push origin -f,⚠️注意慎用! 记得先 pull 获取更新。

    在这里插入图片描述

    1.后悔指令 🔥

    指令
    描述
    git checkout .撤销工作区的(未暂存)修改,把暂存区恢复到工作区。不影响暂存区,如果没暂存,则撤销所有工作区修改
    git checkout [file]同上,file 指定文件
    git checkout HEAD .撤销工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换工作区、暂存区
    git checkout HEAD [file]同上,file 指定文件
    git reset撤销暂存区状态,同 git reset HEAD,不影响工作区
    git reset HEAD [file]同上,指定文件 fileHEAD 可省略
    git reset [commit]回退到指定版本,清空暂存区,不影响工作区。工作区需要手动 git checkout 签出
    git reset --soft [commit]移动分支 masterHEAD 到指定的版本,不影响暂存区、工作区,需手动 git checkout 签出更新
    git reset --hard HEAD撤销工作区、暂存区的修改,用当前最新版
    git reset --hard HEAD~回退到上一个版本,并重置工作区、暂存区内容
    git reset --hard [commit]回退到指定版本,并重置工作区、暂存区内容
    git revert [commit]撤销一个提交,会用一个新的提交(原提交的逆向操作)来完成撤销操作,如果已 push 则重新 push 即可
    • git checkout .git checkout [file] 会清除工作区中未添加到暂存区的修改,用暂存区内容替换工作区。
    • git checkout HEAD .git checkout HEAD [file] 会清除工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换暂存区、工作区。
    # 只撤销工作区的修改(未暂存)
    $ git checkout .
    Updated 1 path from the index
     
    # 撤销工作区、暂存区的修改
    $ git checkout HEAD .
    Updated 1 path from f951a96
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.回退版本 reset

    reset 是专门用来撤销修改、回退版本的指令,支持的场景比较多,多种撤销姿势,所以参数组合也比较多。简单理解就是移动 master 分支、HEAD 的 “指针” 地址,理解这一点就基本掌握 reset 了。

    如下图:

    • 回退版本 git reset --hard v4git reset --hard HEAD~2masterHEAD 会指向 v4 提交,v5v6 就被废弃了。
    • 也可以重新恢复到 v6 版本:git reset --hard v6,就是移动 masterHEAD 的 “指针” 地址。

    在这里插入图片描述
    reset 有三种模式,对应三种参数:mixed(默认模式)、softhard。三种参数的主要区别就是对工作区、暂存区的操作不同。

    • mixed 为默认模式,参数可以省略。
    • 只有 hard 模式会重置工作区、暂存区,一般用这个模式会多一点。

    在这里插入图片描述
    穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。

    git reset [--soft | --mixed | --hard] [HEAD]
     
    # 撤销暂存区
    $ git reset
    Unstaged changes after reset:
    M       R.md
     
    # 撤销工作区、暂存区修改
    $ git reset --hard HEAD
     
    # 回退版本库到上一个版本,并重置工作区、暂存
    $ git reset --hard HEAD~
     
    # 回到原来的版本(恢复上一步的撤销操作),并重置工作区、暂存
    $ git reset --hard 5f8b961
     
    # 查看所有历史提交记录
    $ git reflog
    ccb9937 (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: commit: 报表新增导入功能
    8f61a60 HEAD@{1}: commit: bug:修复报表导出bug
    4869ff7 HEAD@{2}: commit: 用户报表模块开发
    4b1028c HEAD@{3}: commit: 财务报表模块开发完成
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3.撤销提交 revert

    安全的撤销某一个提交记录,基本原理就是生产一个新的提交,用原提交的逆向操作来完成撤销操作。注意,这不同于 resetreset 是回退版本,revert 只是用于撤销某一次历史提交,操作是比较安全的。

    在这里插入图片描述
    如上图:

    • 想撤销 v4 的修改,执行 git revert v4,会产生一个新的提交 v-4,是 v4 的逆向操作。
    • 同时更新 maserHEAD “指针” 位置,以及工作区内容。
    • 如果已 push 则重新 push 即可。
    # revert撤销指定的提交,“-m”附加说明
    $ git revert 41ea42 -m '撤销对***的修改'
    [main 967560f] Revert "123"
     1 file changed, 1 deletion(-)
    
    • 1
    • 2
    • 3
    • 4

    4.checkout / reset / revert 总结

    标题 / 指令
    checkout
    reset
    revert
    主要作用(撤销)撤销工作区、暂存区未提交修改回退版本,重置工作区、暂存区撤销某一次提交
    撤销工作区git checkout [file]git reset HEAD [file]
    撤销工作区、暂存区git checkout HEAD [file]git reset --hard HEAD [file]
    回退版本git reset --hard [commit]
    安全性只针对未提交修改,安全如回退了已 push 提交,不安全安全
  • 相关阅读:
    学院打卡第十四天
    arcgis一个面中剔除多个点仅保留一个点的方法
    达梦数据库执行安装提示./DMInstall.bin: Permission denied处理方法
    安装部署KubeSphere管理kubernetes
    请描述一下Spring MVC的工作流程。在Spring MVC中,DispatcherServlet的作用是什么?
    js实现一行半文本的截取
    网络程序设计——VC的多线程编程(线程与进程)
    这8款浏览器兼容性测试工具,用了以后测试效率可以“起飞”~~
    XV4001BD(数字输出陀螺传感器) 汽车级晶振
    二十、Linux网络配置
  • 原文地址:https://blog.csdn.net/be_racle/article/details/134562545