Git如何回滚代码?
摘要: 多年以后,你面对一个需要回滚的Git仓库,准会想起这篇博客。
某一天,用户跟我反馈,他不能分配任务了。我去看了一下Fundebug捕获的报错信息:
可知,出错原因是前端发送的请求参数有问题。这个悲伤的故事是这样的:后端同时修改了多个接口,但是前端没有及时修改对应的接口调用。
这个问题不难解决,回滚代码就好了,但是,Git如何回滚代码呢?我花了点时间研究了一下。
测试仓库:Fundebug/git-rollback
我写了一个非常简单的测试仓库,master分支只有3个commit,每个commit只是添加一个文件,因此一共有3个文件:01.txt, 02.txt, 03.txt。
git log
commit b39476b9c730d312266fe9bc7f63e795f9ba856f
Author: kiwenlau <kiwenlau@126.com>
Date: Thu Jan 18 14:58:06 2018 +08003个文件commit 3821210392184432de18b596cee58ab7924e39f9
Author: kiwenlau <kiwenlau@126.com>
Date: Thu Jan 18 14:57:38 2018 +08002个文件commit 55d3012564e94a39f6686c0e532c0459ddc41ec4
Author: kiwenlau <kiwenlau@126.com>
Date: Thu Jan 18 14:56:41 2018 +08001个文件
本文介绍的所有回滚代码的命令,都会在一个新的分支执行,方便大家理解:
示例 | 分支 | 说明 | 命令 |
---|---|---|---|
1 | test01 | 撤销最近1次commit | git revert HEAD |
2 | test02 | 撤销某个commit | git revert 3821210392184432de18b596cee58ab7924e39f9 |
3 | test03 | 撤销多个连续commit | git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9 |
4 | test04 | 撤销多个非连续commit | git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9 |
5 | test05 | 重置为某个commit(不保存代码) | git reset --hard 55d3012564e94a39f6686c0e532c0459ddc41ec4 |
6 | test6 | 重置为某个commit(保存代码) | git reset --soft 55d3012564e94a39f6686c0e532c0459ddc41ec4 |
git revert : 撤销特定commit
Git的每一个commit都对应着某些代码改动,那万一改错了呢?这时可以使用git reset来撤销某一次commit的改动。所谓撤销,就是把修改了的代码再改回来。
示例1
最简单的一个场景,就是撤销最近的1次commit:
git revert HEAD
最近1次commit是新增03.txt,撤销这个commit之后,test01分支就只剩下2个文件了:01.txt, 02.txt。
示例2
有时,可能需要撤销某个特定commit,比如,当我需要撤销第2个commit时,指定对应ID即可:
git revert 3821210392184432de18b596cee58ab7924e39f9
最近1次commit是新增02.txt,撤销这个commit之后,test02分支就只剩下2个文件了:01.txt, 03.txt。
由这个示例可知,使用git revert撤销commit时,仅仅针对所撤销的commit,与任何其他commit无关。
示例3
假设我们再做某个功能时,进行了多次commit,需要全部撤销。我们当然可以一个个commit依次revert,这样比较麻烦,其实可以一次性搞定:
git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9
撤销了后面2个commit,test03分支就只剩下1个文件了:01.txt。
示例4
示例3中所撤销的2个commit是连续的,其实,因为revert操作只与单个commit相关,我们也可以撤销多个非连续的commit:
git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 55d3012564e94a39f6686c0e532c0459ddc41ec4
撤销了第1个和第3个commit,test04分支就只剩下1个文件了:02.txt。
git reset:重置为特定commit
示例5
在示例3中,撤销了两个连续的commit,这样做等价于将代码重置为第1个commit的状态:仅有01.txt这1个文件。使用git revert命令有些麻烦,我们可以直接使用git reset命令来实现:
git reset --hard 55d3012564e94a39f6686c0e532c0459ddc41ec4
将仓库强制重置为第1个commit,这样test05分支就只剩下1个文件了:01.txt。git reset --hard与git revert效果看起来一样,但是不同点在于,前者直接删除了后面2个commit及其代码,没有保存commi历史,因此这个操作是不可逆的!使用时应该特别小心。
如果你的本地仓库与远程仓库在reset之前是同步过的,reset之后,两者的commit不一致,本地仓库的commit落后与远程仓库,这样会导致push失败:
git push
To git@github.com:Fundebug/git-rollback.git! [rejected] test05 -> test05 (non-fast-forward)
error: failed to push some refs to 'git@github.com:Fundebug/git-rollback.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
这是需要使用--force选项,这样远程仓库会被强制覆盖:
git push --force
示例6
reset时使用--hard选项是一个很危险的操作,因为它把commit以及代码全删了,没法恢复。如果你只希望删除commit,而保留修改过的代码的话,可以使用--soft选项。
git reset --soft 55d3012564e94a39f6686c0e532c0459ddc41ec4
这时,后面2个commit也被删除了,当前commit为第1个commit。但是,02.txt与03.txt并没有被删除。
git status
On branch test06
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: 02.txtnew file: 03.txt
这就意味着,当你的commit的代码有一些小问题时,可以重置commit,修改一下代码,如何重新commit即可。
参考
- git-revert - Revert some existing commits
- git-reset - Reset current HEAD to the specified state
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...
Git如何回滚代码?相关推荐
- 『实用教程』使用Visual Studio自带的Git管理回滚代码版本
使用Visual Studio自带的Git管理回滚代码版本 需求: 恢复本地某一时刻的版本,并提交覆盖远程版本 操作: 拉取远程最新版本至本地 提交所有更新 操作\查看历史记录,显示所有已提交更新,然 ...
- Git如何回滚代码? 1
摘要: 多年以后,你面对一个需要回滚的Git仓库,准会想起这篇博客. 某一天,用户跟我反馈,他不能分配任务了.我去看了一下Fundebug捕获的报错信息: 可知,出错原因是前端发送的请求参数有问题.这 ...
- 拜托,不要再问我Git如何回滚代码
Hey git学习篇(5) 这个是Git学习的第5篇内容,今天我们来讲讲Git如何做代码回滚. 代码回滚 不知道大家在平常开发时中没有犯过这样一个错误,就是把IDE的配置或者项目运行的本地配置文件上传 ...
- git revert回滚代码
git revert命令用于回滚代码. 举个例子,创建一个gi_revert_test的工程,分别作三次改动:第一次创建demo_file文件,第二次在demo_file文件中添加一些内容,第三次在d ...
- git 代码回滚_git代码版本管理(1)——git版本回滚
git代码版本管理(1)--git版本回滚 1.问题背景 在利用github.gitlab.Gitee等代码管理器中对代码的管理,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提 ...
- sourceTree对git的新建项目、储藏代码、切换分支、回滚代码、提交代码
sourceTree是一个简单的图形化git管理工具 一.新建一个项目 二.储藏代码 三.切换分支 在切换分支之前,可以对当前分支进行储藏,若是想切回原来的分支直接右键储藏的分支选择应用储藏区即可,工 ...
- git回滚代码版本 强制提交代码
git reset --hard [commit id] 回滚代码 git push --force 如果强制提交失败可以试试 git push origin 分支名 --force
- git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!
点击蓝色小字关注! 关注一下你就不会有bug!合并操作 相对于常规的 commit,当使用 git merge 合并两个分支的时候,你会得到一个新的 merge commit. 当我们 git sho ...
- Git:撤销回滚操作
Git撤销&回滚操作(git reset 和 get revert) git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git ...
最新文章
- 20170208--正则表达式
- 洛谷P3953 逛公园
- asp mvc @Html.CheckBox(sel,true) 往后台传值问题
- python打印类的属性
- python中getopt函数_python getopt模块使用方法
- 漫谈iOS Crash收集框架
- 845. 数组中的最长山脉
- web app iphone4 iphone5 iphone6 iphone6 Plus响应式布局 适配代码
- 如何退出while(cinvalue)的循环
- Docker Compose 笔记
- linux jsp mysql_Linux JSP连接MySQL数据库
- 如何实现某个软件的单独断网/稳定地解决fluent断网计算中止问题/tecplot联网后打开程序出现报错问题
- 笔记本电脑如何蹭WiFi
- 一篇文章了解什么是增长黑客
- NLS_LANG详解
- 华夏ERP前端的问题解决
- hbase 源代码分析 (17)MapReduce 过程
- 天河1号计算机配置,“天河一号”超级计算机配置抢先披露
- Windows下的这4款国产神器,请低调收藏使用!
- lamda collectingAndThen的使用