Git 如何优雅地回退代码,用 reset 还是 revert ?_程序员小乐的博客-CSDN博客


本站和网页 https://blog.csdn.net/xiaoxiaole0313/article/details/105760324 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Git 如何优雅地回退代码,用 reset 还是 revert ?_程序员小乐的博客-CSDN博客
Git 如何优雅地回退代码,用 reset 还是 revert ?
程序员小乐
于 2020-04-26 00:08:02 发布
3977
收藏
点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
Be yourself, don\'t change for anyone. If they don\'t like you at your worst, then they don\'t deserve you at your best.
勇敢的做自己,不要为任何人而改变。如果他们不能接受最差的你,也不配拥有最好的你。
每日掏心话
路再远,终有尽头;伤再深,亦会痊愈。我们是自己生命的赶路人,背负着对未来的希冀,走过每一段痛且快乐的时光。
来自:枕边书 | 责编:乐乐
链接:cnblogs.com/zhenbianshu/p/12018714.html
程序员小乐(ID:study_tech)
第 848 次推文   图片来自百度
往日回顾:只需一行代码,你的纯文本秒变Markdown
     
   正文   
前言
从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码、提交、合并等,更复杂的操作没有使用过,看过的教程也逐渐淡忘了,有些对不起 Linus 大神。
出来混总是要还的,前些天就遇到了 Git 里一种十分糟心的场景,并为之前没有深入理解 Git 命令付出了一下午时间的代价。
先介绍一下这种场景,我们一个项目从 N 版本升到 A 版本时引入了另一项目的 jar 包,又陆续发布了 B、C 版本
但在 C 版本后忽然发现了 A 版本引入的 jar 包有极大的性能问题,B、C 版本都是基于 A 版本发布的,要修复 jar 包性能问题,等 jar 包再发版还得几天,可此时线上又有紧急的 Bug 要修,于是就陷入了进退两难的境地。
最后决定先将代码回退到 A 版本之前,再基于旧版本修复 Bug,也就开始了五个小时的受苦之路。
基础试探
revert
首先肯定的是 revert,git revert commit_id 能产生一个 与 commit_id 完全相反的提交,即 commit_id 里是添加, revert 提交里就是删除。
但是使用 git log 查看了提交记录后,我就打消了这种想法,因为提交次数太多了,中途还有几次从其他分支的 merge 操作。
”利益于”我们不太干净的提交记录,要完成从 C 版本到 N 版本的 revert,我需要倒序执行 revert 操作几十次,如果其中顺序错了一次,最终结果可能就是不对的。
另外我们知道我们在进行代码 merge 时,也会把 merge 信息产生一次新的提交,而 revert 这次 merge commit 时需要指定 m 参数,以指定 mainline
这个 mainline 是主线,也是我们要保留代码的主分支,从 feature 分支往 develop 分支合并,或由 develop 分支合并到 master 的提交还好确定,但 feature 分支互相合并时,我哪知道哪个是主线啊。
所以 revert 的文案被废弃了。
Reset
然后就考虑 reset 了, reset 也能使代码回到某次提交,但跟 revert 不同的是, reset 是将提交的 HEAD 指针指到某次提交,之后的提交记录会消失,就像从没有过这么一次提交。
但由于我们都在 feature 分支开发,我在 feature 分支上将代码回退到某次提交后,将其合并到 develop 分支时却被提示报错。
这是因为 feature 分支回退了提交后,在 git 的 workflow 里,feature 分支是落后于 develop 分支的
而合并向 develop 分支,又需要和 develop 分支保持最新的同步,需要将 develop 分支的数据合并到 feature 分支上,而合并后,原来被 reset 的代码又回来了。
这个时候另一个可选项是在 master 分支上执行 reset,使用 --hard 选项完全抛弃这些旧代码,reset 后再强制推到远端。
master> git reset --hard commit_id
master> git push --force origin master
但是还是有问题,首先,我们的 master 分支在 gitlab 里是被保护的,不能使用 force push,毕竟风险挺大了,万一有人 reset 到最开始的提交再强制 push 的话,虽然可以使用 reflog 恢复,但也是一番折腾。
另外,reset 毕竟太野蛮,我们还是想能保留提交历史,以后排查问题也可以参考。
升级融合
rebase
只好用搜索引擎继续搜索,看到有人提出可以先使用 rebase 把多个提交合并成一个提交,再使用 revert 产生一次反提交,这种方法的思路非常清晰,把 revert 和 rebase 两个命令搭配得很好,相当于使用 revert 回退的升级版。
先说一下 rebase,rebase 是”变基”的意思,这里的”基”,在我理解是指[多次] commit 形成的 git workflow,使用 rebase,我们可以改变这些历史提交,修改 commit 信息,将多个 commit 进行组合。
介绍 rebase 的文档有很多,我们直接来说用它来进行代码回退的步骤。
首先,切出一个新分支 F,使用 git log 查询一下要回退到的 commit 版本 N。使用命令 git rebase -i N, -i 指定交互模式后,会打开 git rebase 编辑界面,形如:pick 6fa5869 commit1
pick 0b84ee7 commit2
pick 986c6c8 commit3
pick 91a0dcc commit4这些 commit 自旧到新由上而下排列,我们只需要在 commit_id 前添加操作命令即可。在合并 commit 这个需求里,我们可以选择 pick(p) 最旧的 commit1,然后在后续的 commit_id 前添加 squash(s) 命令,将这些 commits 都合并到最旧的 commit1 上。保存 rebase 结果后,再编辑 commit 信息,使这次 rebase 失效,git 会将之前的这些 commit 都删除,并将其更改合并为一个新的 commit5如果出错了,也可以使用 git rebase --abort/--continue/--edit-todo 对之前的编辑进行撤销、继续编辑。这个时候,主分支上的提交记录是 older, commit1, commit2, commit3, commit4而 F 分支上的提交记录是 older, commit5,由于 F 分支的祖先节点是 older,明显落后于主分支的 commit4,将 F 分支向主分支合并是不允许的所以我们需要执行 git merge master 将主分支向 F 分支合并,合并后 git 会发现 commit1 到 commit4 提交的内容和 F 分支上 commit5 的修改内容是完全相同的,会自动进行合并,内容不变,但多了一个 commit5。再在 F 分支上对 commit5 进行一次 revert 反提交,就实现了把 commit1 到 commit4 的提交全部回退。
这种方法的取巧之处在于巧妙地利用了 rebase 操作历史提交的功能和 git 识别修改相同自动合并的特性,操作虽然复杂,但历史提交保留得还算完整。
rebase 这种修改历史提交的功能非常实用,能够很好地解决我们遇到的一个小功能提交了好多次才好使,而把 git 历史弄得乱七八糟的问题,只需要注意避免在多人同时开发的分支使用就行了。
遗憾的是,当天我并没有理解到 rebase 的这种思想,又由于试了几个方法都不行太过于慌乱,在 rebase 完成后,向主分支合并被拒之后对这些方式的可行性产生了怀疑,又加上有同事提出听起来更可行的方式,就中断了操作。
文件操作
这种更可行的方式就是对文件操作,然后让 git 来识别变更,具体是:
从主分支上切出一个跟主分支完全相同的分支 F。从文件管理系统复制项目文件夹为 bak,在 bak 内使用 git checkout N 将代码切到想要的历史提交,这时候 git 会将 bak 内的文件恢复到 N 状态。在从文件管理系统内,将 bak 文件夹下 除了 .git 文件夹下的所有内容复制粘贴到原项目目录下。git 会纯从文件级别识别到变更,然后更新工作区。在原项目目录下执行 add 和 commit,完成反提交。
这种方式的巧妙之处在于利用 git 本身对文件的识别,不牵涉到对 workflow 操作。
小结
最后终于靠着文件操作方式成功完成了代码回退,事后想来真是一把心酸泪。
为了让我的五个小时不白费,复盘一下当时的场景,学习并总结一下四种代码回退的方式:
revert 适合需要回退的历史提交不多,且无合并冲突的情景。如果你可以向 master 强推代码,且想让 git log 里不再出现被回退代码的痕迹,可以使用 git reset --hard + git push --force 的方式。如果你有些 geek,追求用”正规而正统”的方式来回退代码,rebase + revert 满足你的需求。如果你不在乎是否优雅,想用最简单,最直接的方式,文件操作正合适。
git 真的是非常牛逼的代码管理工具,入手简单,三五个命令组合起来就足够完成工作需求,又对 geeker 们非常友好,你想要的骚操作它都支持,学无止境啊。
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
彻底搞懂MySQL分区,看这篇就对了!
各种 Java Web 开发人员的通用工具
记一次 JAVA 的内存泄露分析
关注订阅号「程序员小乐」,收看更多精彩内容
嘿,你在看吗?
程序员小乐
关注
关注
点赞
收藏
评论
Git 如何优雅地回退代码,用 reset 还是 revert ?
点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文Be yourself, don\'t change for a...
复制链接
扫一扫
Git回退代码到某次commit的实现方法
10-15
主要介绍了Git回退代码到某次commit的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
参与评论
您还未登录,请先
登录
后发表或查看评论
git回滚reset、revert、四种模式,超级详细
Ly
07-09
8575
了解知识
Git四个工作区域
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
一、问题描述
在利用github实现多人合作程序开发的过程中,我们有时会出
git命令回退方法
最新发布
weixin_73001329的博客
11-02
665
git 回退版本
一文彻底搞清git reset和revert区别
白玉梁的专栏
10-08
3206
git是我们常用的版本管理工具,我们团队在合作开发项目时,时常会因为代码及文件的修改提交,导致各种各样的冲突,还有产品需求的频繁变更,致使我们不得不做出回退版本,撤回提交这样的决定,那么此时,reset和revert命令,就派上了用场!
reset,revert都有撤销、回退的意思,但却各有千秋,区别还是很大的,所以该使用哪种命令一定要结合实际情况来决定,本文就是带大家搞清楚两者的区别,然后能准确快速的使用正确的命令去解决实际问题!
下面的例子中,我有3次提交:
初始状态,只有readme一个文件,内容为C
Git恢复之前版本的两种方法reset、revert(图文详解)
热门推荐
游笑天涯
04-14
75万+
一、问题描述
在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset)、反做(revert)。
二、背景知识
git的版本管理,及HEAD的理解
使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么...
常见 几种 git操作代码回退的方法
weixin_46860184的博客
09-30
4112
第一种:当你git commit后 没有push 你想回退
这种情况发生在你的本地代码仓库,可能你add ,commit 以后发现代码有点问题,想要从取消
git reset ....
如果是撤销某个文件或文件夹:
第二种:当你push后想要回退代码
使用 git revert ....
首先你得使用 Git log 查看提交历史
1.不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和
GitLab代码回滚到特定版本
浊世独行侠
05-25
2615
1.在gitlab上找到你要回滚的那个版本 ,复制那次提交的id
2.输入指令,回滚到指定的版本
git reset --hard 复制的id
3.推送到远端(强推)
git push -f origin master
git的突出解决--git rebase之abort、continue、skip
weixin_33809981的博客
05-18
1945
(1)应用实例描述
假设在github或者gitoschina上建立了一个项目,默认分支为master分支,远程master分支上c.sh文件内容:
开发者A、B分别将项目拷贝到自己本地进行开发
某一天,开发者B提交c.sh,并且提交成功,
之后,开发者A在本地代码并没有和远程master分支的代码同步的情况下,对本地的c.sh进行了修改,修改后c.sh内容如下:
...
gitlab 回退到指定版本
yayayu_的博客
06-10
5845
gitlab 回退到指定版本
1、进入项目工程所在的文件夹,切换到对应的回退分支(develop/master)
2、从remote拉去(pull)最新的代码,同时也是将线上的提交合并记录拉去下来
3、进入git cmd 页面 ==> 通过鼠标右键选中【Git Bash Here】进入git cmd页面
4、获取指定历史版本id
方式一: 使用git log 命令查看所有的历史版本,获取某个历史版本id(核对刚才自己找到的id)
方式二:
在Gitlab页面通过history查看要项目历史版本:
Git撤销&回滚操作(git reset 和 get revert)(^_^^_^)
jaryle的专栏
11-12
6285
git的工作流
工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。
暂存区:已经 git add xxx 进去,且未 git commit xxx 的。
本地分支:已经git commit -m xxx 提交到本地分支的。
这里写图片描述
代码回滚
在上传代码到远程仓库的时候,不免会出现问题,任何过程都有可能要回滚代码:
1、在工作区的代码
git checkout -- a.txt # 丢弃某个文件,..
git revert实战
secretx的专栏
05-20
2万+
1.reset revert区别
git reset是直接删除指定的commit,把HEAD向后移动了一下
git revert是一次新的特殊的commit,HEAD继续前进,本质和普通add commit一样,仅仅是commit内容很特殊:提交的内容是与前面普通commit文本变化的反操作。比如前面普通commit是增加一行a,那么revert内容就是删除一行a
由于reset
git 代码回退
jkwanga的博客
12-27
1324
笔记:
git代码回退
1. git log//记录
2. git reset --hard ID//回退本地代码库 ID是commit ID
3. git push -f //强推到远程
多人 git 提交 流程 //参考上篇 git rebase
git checkout jk_dev//
git addxx//
git commit -s//现暂存自己的分支
git fetch //再拉取最新的
git rebase develop //合并到自己的分支
git push
git 代码回滚 reset revert 详解 IDEA操作 4种reset区别
半亩方糖
02-24
9589
我们用 git 在单人或者多人开发的时候,有时候出现的 错误的提交 ,我们此时 撤销 之前的操作,回退、回滚 到之前的版本,这里总结了 2种方法:reset(删除错误提交) 和 revert(新建提交覆盖)
三步学会reset和revert回滚,撤销revert
MrFano的博客
10-17
7559
revert
$ git revert commit id
$ git commit
$ git push
reset 慎用
$ git reset --hard comm...
git回退代码指令操作
蓑笠翁
11-14
6928
介绍
  代码回退包含两种情况,对应reset和revert指令;reset是回退代码到某一版本,某一版本以后的代码都不保存,revert是只回退某一版本代码,对齐它版本代码不影响。对于多人协作开发任务,更推荐使用第二种方法回退代码。回退代码流程同样分为三步:首先查看日志,确定要回退的代码版本,再回退到该版本,最后提交代码,现对该两种方法流程都给出指令说明:
1)回退到某一版本
git log //查看HEAD日志
git reset --hard [目标版本号] //目标版本号为HEAD编号,一般
如何用 Git 优雅回退代码,别搞错了!
勇往直前的专栏
02-13
2573
从接触编程就开始使用Git进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码、提交、合并等,更复杂的操作没有使用过,看过的教程也逐渐淡忘了,有些对不起 Linus 大神。
出来混总是要还的,前些天就遇到了Git里一种十分糟心的场景,并为之前没有深入理解Git命令付出了一下午时间的代价。
先介绍一下这种场景,我...
git常用命令
sun007700的专栏
04-10
269
参考
https://gitee.com/progit/
https://www.liaoxuefeng.com/wiki/896043488029600
1. 以master为母板添加新的远程分支
git pull
git push origin master:develop
#develop就是新分支
#创建本地分支develop
git checkout -b develop ...
GitLab回滚到提交的指定版本
精灵鼠小强的博客
11-09
2099
获取指定版本commit SHA
  进入到我们的gitlab页面,进入到指定的分支branch或者主干master中,选择你要回滚到的指定的版本,点击如下图所示的按钮进行copy commit SHA,这样你会得到6b9f9481b45b562a1949898504f74e3695a这种一长串的编码。
本地回滚
  本地文件回滚到指定版本
git reset --hard 66b9f9481b45b562a1949898504f74e3695a
远程回滚
  远程回滚,保证远程服务器也进行回滚到指定
Git恢复之前版本的三种方法reset、revert、rebase 及其他操作
weixin_44781409的博客
07-24
4793
一. 问题描述
在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了三种解决方法:回退(reset)、反做(revert)、回扣(rebase)。
二. 解决方案
方法一:git reset
原理: git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本
具体实现:
查看版本号 使用命令“git log”查看:
使用“git reset --hard 目标版本号”命令将版
git撤销commit
Y_FQY的博客
10-13
791
写完代码后,我们一般这样
git add . //添加所有文件
git commit -m “本功能全部完成”
执行完commit后,想撤回commit,怎么办?
这样凉拌:
git reset --soft HEAD^
这样就成功的撤销了你的commit
注意,仅仅是撤回commit操作,您写的代码仍然保留。
说一下个人理解:
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
至于这几个参数:
–mixed
意思是:不删除工作空间改动代
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
程序员小乐
CSDN认证博客专家
CSDN认证企业博客
码龄8年
暂无认证
15
原创
2万+
周排名
68万+
总排名
251万+
访问
等级
1万+
积分
616
粉丝
619
获赞
338
评论
3051
收藏
私信
关注
热门文章
全球第二大成人网站,黄了!
87809
这回把Spring @Async彻底搞懂了
51668
记住看小电影前一定要检查网址是不是 HTTPS 的,不然…
32246
Java中的BigDecimal,你真的会用吗?
26065
永别了,91网站!宣布永久关闭
23279
分类专栏
前端
1篇
Android
3篇
最新评论
Java 8 中 Map 骚操作之 merge() 的用法
有啥别有 bug:
看个人吧哈哈,我都是自己写
HAProxy从零开始到掌握
还敢奋不顾身:
Nginx相比呢
又一个程序员被判刑了!运维违规操作被判5年半,IT从业需要懂法律!
屿舟:
他为什么不销毁笔记本
微信新BUG曝光:好友偷偷删了你,这样就能查出来
♛Smile♛:
亲测 没有用 大家不用试了
为什么我觉得Python烂的要死?原因有八
aegeanMoon:
我也觉得python很烂,都懒得看
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Vue 的这些技巧你真的都掌握了吗?(整理汇总 Vue 框架中重要的特性、框架的原理)
让人上瘾的新一代开发神器,彻底告别Controller、Service、Dao等方法
策略模式-优雅的改造短信业务模块
2022
07月
1篇
05月
88篇
04月
104篇
03月
93篇
02月
102篇
01月
105篇
2021年1459篇
2020年1235篇
2019年80篇
2016年2篇
2015年1篇
目录
目录
分类专栏
前端
1篇
Android
3篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值