介绍

在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验)。这种情况下,菜鸟程序员可能就会虎驱一震,紧张得不知所措。而资深程序员就会微微一笑,摸一摸锃亮的脑门,然后默默的进行版本回退。

对于版本的回退,我们经常会用到两个命令:

git reset
git revert
那这两个命令有何区别呢?先不急,我们后文详细介绍。

git reset

假如我们的系统现在有如下几个提交:


其中:A 和 B 是正常提交,而 C 和 D 是错误提交。现在,我们想把 C 和 D 回退掉。而此时,HEAD 指针指向 D 提交(5lk4er)。我们只需将 HEAD 指针移动到 B 提交(a0fvf8),就可以达到目的。

只要有 git 基础的朋友,一定会想到 git reset 命令。完整命令如下:

git reset --hard a0fvf8
命令运行之后,HEAD 指针就会移动到 B 提交下,如下图示:

而这个时候,远程仓库的 HEAD 指针依然不变,仍在 D 提交上。所以,如果直接使用 git push 命令的话,将无法将更改推到远程仓库。此时,只能使用 -f 选项将提交强制推到远程仓库:

git push -f
采用这种方式回退代码的弊端显而易见,那就是会使 HEAD 指针往回移动,从而会失去之后的提交信息。将来如果突然发现,C 和 D 是多么绝妙的想法,可它们已经早就消失在历史的长河里了。

而且,有些公司(比如良许的公司)明令禁止使用 git reset 命令去回退代码,原因与上述一样。所以,我们需要找到一个命令,既可以回退代码,又可以保存错误的提交。这时,git revert 命令就派上用场了。

git revert

git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。

使用 git revert 命令来实现上述例子的话,我们可以这样做:先 revert D,再 revert C (有多个提交需要回退的话需要由新到旧进行 revert):

git revert 5lk4er
git revert 76sdeb
这里会生成两个新有提交:D’ 和 C’,如下图示:

这里只有两个提交需要 revert,我们可以一个个回退。但如果有几十个呢?一个个回退肯定效率太低而且容易出错。我们可以使用以下方法进行批量回退:

git revert OLDER_COMMIT^…NEWER_COMMIT
这时,错误的提交 C 和 D 依然保留,将来进行甩锅的时候也有依可循。而且,这样操作的话 HEAD 指针是往后移动的,可以直接使用 git push 命令推送到远程仓库里。而这种做法,正是企业所鼓励的。

我们再举个更难一点的例子。

假如现在有三个提交,但很不巧的是,那个错误的提交刚好位于中间。如下图示:

这时,直接使用 git reset 命令将 HEAD 指针重置到 A 提交显然是不行的,因为 C 提交是正确的,需要保留的。先把 C 提交 及 B 提交全部回退,再使用 cherry-pick 命令将 C 提交重新再生成一个新的提交 C’’,这样就实现了将 B提交回退的需求。完整的过程如下:

通过以上对比可以发现,git reset 与 git revert 最大的差别就在于,git reset 会失去后面的提交,而 git revert 是通过反做的方式重新创建一个新的提交,而保留原有的提交。在企业里,应尽量使用 git revert 命令,能不用 git reset 命令尽量不用。

参考博客

[1]https://mp.weixin.qq.com/s/H5odqcmMhVyiZpEMWtvokw

GitHub进行版本回退相关推荐

  1. [github] - git使用小结(分支拉取、版本回退)

    1. 首次(fork项目之后) $ git clone [master] $ git branch -a $ git checkout -b [自己的分支名] [远程仓库的分支名] 克隆的是主干网络 ...

  2. Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取

    1. 高频命令 git add 将工作文件修改提交到本地暂存区. git add . 将所有修改过的工作文件提交暂存区(常用). git commit -m "XXX" 为本次修改 ...

  3. 删除隐藏版本信息 版本回退_Git系列之-分布式版本控制Git详解

    课程简介: 课程目标:通过本课程的学习,将全面掌握Git版本管理工具的配置与使用,以适应工作的需要. 适用人群:具有一定开发基础的开发人员. 课程概述:Git (读音为/gɪt/)是一个开源的分布式版 ...

  4. GIt版本回退还不会用?轻松学会不怕失误

    场景 本地Commit了两次,等到推送到github时,发现第一次commit提交的文件有一个大于100m,无法提交成功, 所以需要将版本回退到两次提交之前. 实现 首先输入: git reflog ...

  5. 【Git笔记2】必知习惯和如何版本回退

    良好的习惯会让工作和生活如鱼得水,在使用git的时候有些必知习惯和概念你要get一下,总有些许失误,如:已经提交了不合适的修改到版本库时还没有把自己的本地版本库推送到远程,想要撤销本次提交,或者已经p ...

  6. 删除隐藏版本信息 版本回退_git之版本穿梭术

    上一篇主要针对使用git add和git commit两个指令提交文件到本地版本库做了详细的介绍,其实提交文件到版本库无非就是两个步骤,先将文件添加到暂存区,所有要提交的文件全部添加完毕,统一提交到版 ...

  7. Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突...

    Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下G ...

  8. Git使用 从入门到入土 收藏吃灰系列 (九) git reset 移除暂存区与版本回退

    文章目录 一.前言 二.Git远程命令实践 2.1git reset 移除暂存区 2.2 git log+git reflog+git reset 版本回退 一.前言 参考安装Git 详细安装教程 参 ...

  9. git版本回退命令_刘先生

    如果你在本地做了错误提交,那么回退版本的方法很简单 1.先用下面命令找到要回退的版本的commit id: git reflog 2.接着回退版本: git reset --harda7e1d279 ...

最新文章

  1. 百度成立小度蓝牙联盟,DMA+小度App打造蓝牙语音风口
  2. Matlab与机器学习-- 数据的归一化
  3. java监控对话框是否关闭_java – 检查是否可以安全地关闭对话框
  4. 介绍Windows Azure移动服务:用于您连接的客户端应用程序的后端
  5. 使用RNN解决NLP中序列标注问题的通用优化思路
  6. Undo/Redo框架实现
  7. thinkphp php5.4报错,ThinkPHP6.0在PHP8下报错解决方法
  8. 15. 注意string实现的多样性
  9. iPhone 各屏幕尺寸及解析
  10. 史上最全面的Javaweb完整学习教程,Java小白必备!
  11. 基于深度区域的金字塔神经网络用于铝合金表面各种缺陷的自动检测和多分类—论文笔记
  12. 四旋翼飞行器14——无人机中的OSD、数传、图传、FPV是什么?
  13. 安全删除硬件并弹出媒体的列表中出现内置硬盘的解决办法.
  14. 负载均衡性能参数如何测评?
  15. 苏宁低调内测“宁互宝”,网络互助成巨头必争之地...
  16. 二叉树、平衡二叉树、红黑树、B-树、B+树、B*树、T树之间的详解和比较
  17. 为什么沃尔玛等零售商会结成移动支付联盟 ?
  18. 1556_AURIX_TC275_复位系统控制单元
  19. YYDS!使用 Python 全面分析股票数据特征
  20. 从0开始学Unity做SLG系列(发布篇)

热门文章

  1. java建立英文停用词表_pyhanlp 停用词与用户自定义词典
  2. VLOOKUP函数 table_array:无效引用
  3. U盘格式选择 FAT32、exFAT、NTFS
  4. Esp32+Dht11+MQTT+Mysql实现测温数据传至数据库
  5. 面试常见SQL练习题
  6. 数据结构与算法(六)- 单向链表的反转
  7. Linux中磁盘读写速度测试
  8. 微信小程序接口实现加密
  9. 朱小丹调研广东工业机器人产业有何深意?
  10. 互联网风雨十年,我所经历的技术变迁