Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Git如何优雅的进行版本回退?

Git如何优雅的进行版本回退?

作者头像
Java识堂
发布于 2019-05-22 15:01:25
发布于 2019-05-22 15:01:25
80600
代码可运行
举报
文章被收录于专栏:Java识堂Java识堂
运行总次数:0
代码可运行

本转载自微信公众号 良许Linux

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

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

  1. git reset
  2. git revert

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

git reset

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard a0fvf8

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push -f

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

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

git revert

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git revert 5lk4er
git revert 76sdeb

这里会生成两个新有提交:D' 和 C',如下图示:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 命令尽量不用。

推荐阅读:

MySQL索引优化实战

帮你体系化的学习Git

Java识堂

一个有干货的公众号


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java识堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git 如何优雅的版本回退?
在版本迭代开发过程中,相信很多人都会有过错误提交的时候(至少良许有过几次这样的体验)。这种情况下,菜鸟程序员可能就会虎驱一震,紧张得不知所措。而资深程序员就会微微一笑,摸一摸锃亮的脑门,然后默默的进行版本回退。
grain先森
2019/05/07
2.1K0
Git 如何优雅的版本回退?
Git版本回退方法论(可能解决你101%遇到的Git版本问题)
由于本人刚到新公司,也是毕业不久,经验不足,经常导致 git 事故发生,特此总结遇坑解决方法,以示后人。
JavaEdge
2020/05/27
1.1K0
[Git] 如何进行版本回退
版本控制系统最重要的能力之一,就是能够轻松地在项目的不同历史版本之间切换。有时,你可能发现最近的修改引入了严重问题,或者需要回到之前的某个节点重新开始。这时,“版本回退”功能就派上用场了。
DevKevin
2025/05/30
1710
[Git] 如何进行版本回退
IDEA中Git版本回退终极指南:Reset与Revert双方案详解
作为开发者,代码版本回退是日常高频操作。IntelliJ IDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择困惑。本文将解析Reset与Revert两种方案的操作细节及避坑指南。
Java微观世界
2025/03/05
4.4K1
IDEA中Git版本回退终极指南:Reset与Revert双方案详解
【Git笔记2】必知习惯和如何版本回退
良好的习惯会让工作和生活如鱼得水,在使用git的时候有些必知习惯和概念你要get一下,总有些许失误,如:已经提交了不合适的修改到版本库时还没有把自己的本地版本库推送到远程,想要撤销本次提交,或者已经push到远程库想要回退(撤销)。今天我们接着上篇 【Git笔记1】本地项目与GitHub远程仓库互联,趁热打铁,开始实操,来看看怎么处理这些问题。
小小詹同学
2019/11/11
5200
Git常用命令-你都用过吗?
set LESSCHARSET=utf-8 --IDE Terminal乱码(idea自带的操作git窗口) git clone 分支名 --将分支克隆到本地 git stash --将修改暂时放到暂存区,在a分支改了东西,想先切到b分支,可以先用这个命令 git stash pop --从暂存区弹出,从b再切回a,用这个命令把改的恢复 git checkout 分支名或文件名 --切换到分支 git pull --拉取最新文件(更新) //这三个通常一起使用 用于提交代码到远程分支 git add 文件名 --添加文件(用于后续提交) git commit -m "提交备注信息" --提交文件到本地分支 git push --推送到远程分支
编程大道
2019/12/04
6950
Git详细教程 – Git版本回退
通过《Git详细教程 - 初识》、《Git详细教程 – Git的安装》和《Git详细教程 – 版本库的创建和添加内容到版本库》课程,相信大家对Git已经非常熟悉了,Git的由来,作用等等,之前讲了创建版本和提交内容,今天来讲讲,如果提交内容时错误的,想要回滚到上一个版本怎么做了?
Javanx
2019/09/05
5710
Git详细教程 – Git版本回退
[日常] git版本回退
先克隆一个空的测试仓库,这是我自己在gitlab里创建的空仓库 git clone http://192.168.1.114:8090/admintsh/blog.git
唯一Chat
2019/11/12
7850
Git撤销&回滚操作(git reset 和 get revert)
俗话说,老虎也有打盹的时候。我们提交代码,也会有出错的时候。 我今天不小心把不该提交的文件给提交了。
赵云龙龙
2020/02/13
39.1K0
Git撤销&回滚操作(git reset 和 get revert)
git版本回退, github版本回退
上周提交了更改,过了周末回来说要撤销上个story。于是,需要找到上周提交的版本,rollback回来。 git版本管理命令,自从习惯使用管理工具之后就很少接触了,当突然寻找其他指令的时候就成浆糊了,ctrl+k只能顺利的提交而无关管理。因此,工具简化操作却弱化了技能。就像前几天听到的BBC 6分钟英语的一段对话。 Rob说他当年在酒吧实习,对钱的加减算法很熟悉很强,因为那时候计算机还没有推广。 计算器的出现使人们放弃了自己计算的本领。有时候即便仅仅是简单的加减法也不愿用自己的脑袋计算了。不说好坏,自己的感
Ryan-Miao
2018/03/13
1.9K0
git版本回退, github版本回退
IDEA 中如何完成 Git 版本回退?
上周的文章发了后,有小伙伴问如何在 IDEA 中进行 Git 的版本回退? 其实这个松哥之前写过文章,但是时间久远了,所以今天再和小伙伴们重新捋一捋这个话题,顺便也来聊聊如何在 IDEA 中进行 Git 的版本回退。 Git 中的撤销操作,我们可以归纳为四类: 工作区的代码想撤销 add到暂存区的代码想撤销 提交到本地仓库的代码想撤销 远程仓库的代码想要撤销 1. 基于命令行 1.1 工作区的代码想撤销 可能有一天我正在写代码,写了很久发现写错了,想恢复到一开始的状态,一个笨办法就是把刚刚写的代码一行一行的
江南一点雨
2022/03/04
2.7K0
Git 版本回退方法
场景一:如果想将代码恢复到之前某个提交的版本,且那个版本之后提交的版本都不要了,就可以使用 git rest
超级小可爱
2023/02/23
9690
Git如何版本回退?
Git中,每次commit提交都会生成一个历史纪录。使用 git log 查看commit历史:
技术从心
2019/08/09
2.3K0
珍藏多年的 Git 问题和操作清单
本文整理自工作多年以来遇到的所有 Git 问题汇总,之前都是遗忘的时候去看一遍操作,这次重新整理了一下,发出来方便大家收藏以及需要的时候查找答案。
猿天地
2019/09/03
1.4K0
珍藏多年的 Git 问题和操作清单
Git回退实战之add和commit回滚
初入职场,由于自己的失误或者对git不熟悉,把被人的代码给冲突掉了,然后需要立马回滚,对于新手开发,应该比较常见吧!或者,比较多一种情况,错误把工程add了到了暂存区,比如一些本地配置,本来就不应该提交的,又或者,开发中只提交部分代码,又想最新的提交合并到上一次提交,等等,很多种场景,我们都会用到git版本回退/回滚。接下来就各位初入职场的同学们讲一下如何代码回退/回滚,让同学们对代码回退/回滚不在恐惧。
小明爱吃火锅
2023/09/16
1.7K1
时光穿梭机-Git版本回退
现在,对于多数程序员来讲,Git相关需要学会修改提交到Git版本库,修改文件如下:
php007
2019/10/10
3820
时光穿梭机-Git版本回退
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
一个夜黑风高的夜晚,独自苦逼加班的狗哥默默搬砖,长时间的工作压迫,狗哥怒从心头起,恶向胆边生,稀里糊涂的将内心的愤怒写到项目注释及git提交描述中,并且push推送到了远程。
JavaDog程序狗
2024/10/01
2800
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
如何使用 Git Rebase 优雅回退代码?
使用命令 git revert commit_id 能产生一个 与 commit_id 完全相反的提交,即在 log 中会看到一条新的提交 new_commit_id, revert 提交就是删除 commit_id 的提交。
Yorkyu
2022/03/22
5K0
如何使用 Git Rebase 优雅回退代码?
Git如何删除某次commit 操作
4.如果这个时候,你突然发现回退版本错了,那么就用git reflog查看提交记录
乱码三千
2021/07/29
13K0
Git如何删除某次commit 操作
【Git版本控制器】第三弹——版本回退,撤销修改,删除文件
因为如果我们在工作区进行了编写代码,如果直接用--hard,那么工作区没有进入版本库里面的代码就消失了,再也找不到了。
用户11396661
2025/02/18
2590
【Git版本控制器】第三弹——版本回退,撤销修改,删除文件
相关推荐
Git 如何优雅的版本回退?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验