文章目录

  • 综述
  • 背景说明
  • 查看提交历史
    • 1 格式化
    • 2 筛选检索
    • 3 最近提交
  • 版本回退
    • 1 `reset`方法回退
    • 2 `revert`方法回退
  • 恢复回退

综述

本文档主要用于详细说明如何使用Git进行版本回退,主要包含四个方面:

  1. 背景说明
  2. 查看提交历史
  3. 版本回退
  4. 恢复回退

背景说明

在使用git版本控制进行开发的过程中,我们有时会出现错误提交的情况,存在误提交的时候怎么办呢?,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:reset复位、revert恢复。

查看提交历史

在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是git log命令。

git log如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值(commit id),作者、提交日期、和提交说明。如果记录过多,则按Page UpPage Down来控制显示;按Q退出历史记录列表。

查看git log命令文档

下面介绍几种常用的git log使用方式:

1 格式化

  • 如果想获取每条日志的简要信息,可以使用git log --pretty=oneline,精简一行显示;

  • 如果想在查看的时候只显示简略的commit id,那么可以使用git log --abbrev-commit

  • 如果想在查看的时候想获取全部基本信息,可以使用git log --pretty=full,这也是默认的形式。因此直接使用git log也可以;

  • 如果想获取更详细的信息,使用git log --pretty=fuller;

  • 如果想查看带图形的日志使用git log --graph;

  • 定制记录的显示格式显示使用git log --pretty=format:"%h - %an, %ar : %s";点击查看常用格式选项

--pretty这个选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。比如oneline会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有shortfullfuller选项,它们展示信息的格式基本一致,但是详尽程度不一。

2 筛选检索

  • 支持通过作者来查询git log --auther='作者名'
  • 支持时间,--after--before,after在某个时间点后;before在某个时间点前git log --before='2021-03-12 12:29:29'
  • 支持时间区间,各个条件之间是的关系,可以联合使用;

3 最近提交

  • 直接使用git log -n查看即可,n为一个具体数字,前n条,可省略,省略则分页展示全部;
  • 显示简要的增改行数统计,每次提交文件的变更统计git log --stat -n-n同上;

版本回退

1 reset方法回退

此种方式不是很推荐,通过reset的方式,把head指针指向之前的某次提交,reset之后,后面的版本就找不到了。例如我们在开发种一共提交了四次分别是A、B、C、D,此时我们发现操作失误需要回退到B,则使用reset之后C、D就不再存在与时间线上了。

git reset --hard commit id

reset回退操作步骤:

  1. 使用git log查找到所需要回退到的版本号,即提交记录的commit id;例如:576223db1ee100a79b4f82d6713cef700d723018
  2. 在客户端执行如下命令(执行前,先将本地代码切换到对应分支)git reset --hard 576223db1ee100a79b4f82d6713cef700d723018
  3. 强制push到对应的远程分支git push -f -u origin master或者git push -f,此时如果用git push会报错,因为我们本地库HEAD指向的版本比远程库的要旧;

此时,版本回退完成。

这种操作存在一个问题,服务器上的代码虽然被还原了,但假如有多个人在使用,他们本地的版本依然是比服务器上的版本高的,所以,别人再重新提交代码的话,你撤销的操作又会被重新,你上面的操作也就白操作了。解决办法是,让别人把本地的分支先删掉,然后重新从服务器上拉取分支。

2 revert方法回退

这种方式就比较推荐了,这种方式不会把版本往前回退,而是生成一个新的版本。所以,你只需要让别人更新一下代码就可以了,你之前操作的提交记录也会被保留下来。例如我们在开发种一共提交了四次分别是A、B、C、D,此时我们发现操作失误需要回退到B,则使用revert之后会生成一个E版本。

git revert -n commit id

revert回退操作步骤:

  1. 使用git log查找到所需要回退到的版本号,即提交记录的commit id;例如:a53a22f1e8b7ed0c7a9355e8563d234b5b99dd53
  2. 在客户端执行如下命令git revert -n a53a22f1e8b7ed0c7a9355e8563d234b5b99dd53;
  3. 使用git commit -m '版本回退'进行提交;
  4. git push同步推送到远程仓库即可;

推送之后让其他人更新一下本地代码即可。

恢复回退

这个时候突然又发现不需要回退了,刚才那些消失的代码又要重新找回来了,别担心,这种操作步骤和版本回退一个倒立!

  1. 我们可以通过git reflog查看本地的操作历史,找到对应的commit id

  2. 然后再使用git reset --hard commit id就回到之前的操作了。

Git版本回退的两种方式及回退方式推荐相关推荐

  1. 二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式

    1.文件上传 2.后端文件上传 两种方案: 兼容性较好的commons-fileupload,支持所有版本的Servlet,即所有版本的Tomcat 优点: 兼容性 缺点 需要外部jar,比较麻烦.代 ...

  2. 两种获取connectionString的方式

    两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...

  3. Hibernate中两种获取Session的方式

    转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...

  4. 在计算机系统中有两种不同的图像编码方式,第二章计算机系统与计算原理.ppt...

    第二章计算机系统与计算原理 大学计算机基础 * 信息表示与处理 ----西文字符 ASCII 码是美国信息交换标准代码(American Standard Code for Information I ...

  5. TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable

    TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable 目录 输出结果 代码设计 输出结果 代码设计 # tensorflow中的两种定义scope(命 ...

  6. data 谷歌浏览器更改user 路径_chrome浏览器的跨域设置——包括版本49前后两种设置...

    做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程.但是新版本的chrome浏览器提 ...

  7. python用outlook自动发邮件_python使用两种发邮件的方式smtp和outlook示例

    smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置一下.outlook发送就是Python直接调用win32方式.调用程序outlook直接发送邮件. import win32com ...

  8. oracle单列转行,oracle 两种列转行的方式

    oracle两种列转行的方式 select  baseItem.SUIT_TO, wmsys.wm_concat(to_char(dict.DICT_VALUE)) as dicv from T_ST ...

  9. 基于ArcGIS JS API实现的两种距离和面积测量方式

    文章目录 前言 开发思路 主要代码 效果测试 效果图 测试页面 开发总结 参考链接 前言 在一些地图地图应用中,距离.面积测量属于基础功能.ArcGIS API for JavaScript有单独提供 ...

  10. python通过outlook发送邮件_python使用两种发邮件的方式smtp和outlook示例

    本篇文章主要介绍了python使用两种发邮件的方式smtp和outlook示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置 ...

最新文章

  1. 【原创】如何在 Linux 下调整可打开文件/文件描述符数目
  2. Android Studio中的代码格式快捷方式
  3. sublime的安装
  4. Git远程推送和抓取分支
  5. 使用data-自定义数据及如何获取该值
  6. python2.7输入函数_Python2.7的用户输入函数有问题,无法让这些输入与程序一起工作...
  7. simulink 快捷键 运行_【泡泡读者来搞】ROS、Simulink、Carsim的互联与规划、控制算法的验证...
  8. 获取listview当前滚动的高度
  9. Octotree:一款超实用的GitHub可视化代码树插件
  10. Allegro如何更改铜皮的网络操作指导
  11. C语言中-是什么意思啊?比如说 p=p-next 到底表达了什么意思,请说清楚点,还有-这个符号是一个整体吗,什么意思??...
  12. SCRCPY与Android操作流程(华为手机) 原创超详细
  13. ae制h5文字动画_对于8个华丽的HTML5文字动画特效图文赏析
  14. 正则表达式去掉以 开头和结尾的
  15. 陈式太极拳小架一路拳谱(陈鑫拳架)
  16. L1-009 N个数求和 (20分)(分数求和)
  17. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?
  18. UE4元数据关键字的应用与含义,函数的标记和特殊使用(三)
  19. CH340驱动问题,由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)
  20. 从单片机到ARM Linux驱动——Linux驱动入门篇

热门文章

  1. JS基础 day1 | JS介绍、变量常量、数据类型及转换
  2. 附加题——求n的阶乘和
  3. android 环信8.0通知栏,环信客服机器人v8.0.3发布:教你快速构建知识库,精准识别访客意图...
  4. python识别验证码 免费API接口
  5. java实现-强智教务系统API文档-全部java封装
  6. Simulink仿真计算中保留特定位数的小数
  7. 多图详解CLH锁的原理与实现
  8. 【Babel】1186- 保姆级教学!这次一定学会 Babel 插件开发!
  9. 用java下载apk解析包出错_教大家解析包时出现问题怎么解决
  10. Java随笔记 - 断包和粘包 解决方法