摘要: 多年以后,你面对一个需要回滚的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 +0800 3个文件 commit 3821210392184432de18b596cee58ab7924e39f9
Author: kiwenlau <kiwenlau@126.com>
Date: Thu Jan 18 14:57:38 2018 +0800 2个文件 commit 55d3012564e94a39f6686c0e532c0459ddc41ec4
Author: kiwenlau <kiwenlau@126.com>
Date: Thu Jan 18 14:56:41 2018 +0800 1个文件

本文介绍的所有回滚代码的命令,都会在一个新的分支执行,方便大家理解:

示例 分支 说明 命令
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 –hardgit 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.txt
new file: 03.txt

这就意味着,当你的commit的代码有一些小问题时,可以重置commit,修改一下代码,如何重新commit即可。

参考

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/01/24/git-rollback-tutorial/

Git如何回滚代码?的更多相关文章

  1. git master 回滚代码

    回退到指定版本 f6a3d430 (为commit id 前8位) git reset --hard f6a3d430 强制推送到远程分支 git push origin HEAD --force 但 ...

  2. git用法之[回滚代码]

    我们在写代码的任何过程中,都有可能出错,任何过程都有可能要!回!滚!代!码!事关重大!一定要详细讲讲. 一.关于 工作区.暂存区.本地分支: 工作区:即自己当前分支所修改的代码,git add xx ...

  3. git如何正确回滚代码

    git如何正确回滚代码 方法一,删除远程分支再提交 ①首先两步保证当前工作区是干净的,并且和远程分支代码一致 $ git co currentBranch $ git pull origin curr ...

  4. Git撤销&回滚操作(git reset 和 get revert)

    转自:https://blog.csdn.net/asoar/article/details/84111841 git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 ...

  5. svn上想回滚代码怎么办?——svn merge 命令

    小博客断更了很久,最近想接着尝试建立写作的习惯,把自己工作生活遇到的有用知识沉淀下来.尽管微信公共账号比较火,但个人觉得这种不能用搜索引擎检索的东西完全就是历史的倒退,就像 RSS 这种提高信息传播效 ...

  6. git如何回滚当前修改的内容?

    git如何回滚当前修改的内容? 1.打开git gui,在工具栏上点击 commit ,选择 Revert Changes,  这里可以回滚单个文件: 2.一键回滚所有修改: 打开git gui,在工 ...

  7. Git回滚代码暴力法

    Git回滚有多种方式,这里使用的是[强制提交到远程分支] 效果为:如回滚前的提交记录是 1.2.3.4,使用这种方法回滚到2,那么提交记录就变成了1.2. 操作方法: 需要在本地的Git仓库,右键选择 ...

  8. git 分回滚后无法合并代码问题

    git reset & git revert 区别: 1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit. 2. 在回滚 ...

  9. 记录一次git回滚代码

    老大临时让更新一版代码到本地,熟练的git fetch/git merge 之后,出来了一批改动的文件,但是并不是我改动的. 我以为是版本迭代出来的其他同事改的,我就直接给add commit到我的版 ...

随机推荐

  1. Windows 10 IoT Core 17115 for Insider 版本更新

    今天,微软发布了Windows 10 IoT Core 17115 for Insider 版本更新,本次更新只修正了一些Bug,没有发布新的特性. 一些已知的问题如下: F5 driver depl ...

  2. LabVIEW(八):程序结构中的循环结构

    1.程序结构分为三种:循环结构.分支结构.顺序结构. 本文主要讨论循环结构. 2.While循环 左下角:循环计数端子i,从0开始计数,每进行一次循环,i自动增加1. 右下角:循环条件端子,当循环达到 ...

  3. ubuntu下makeinfo安装,其实真正安装的是texinfo包

    操作系统环境:ubuntu 在终端中执行命令:sudo apt-get install texinfo   今天在打包的时候有个包需要 makeinfo,当时就各种搜结果就没有 makeinfo 这个 ...

  4. Redis 如何分析慢查询操作?

    什么是慢查询 和mysql的慢SQL日志分析一样,redis也有类似的功能,来帮助定位一些慢查询操作. Redis slowlog是Redis用来记录查询执行时间的日志系统. 查询执行时间指的是不包括 ...

  5. 动态dp初探

    动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...

  6. ASP.NET Core微服务+Tabler前端框架搭建个人博客2--系统架构

    功能分析 在整个微服务架构的搭建过程中,我们需要做的第一步就是对服务进行拆分,将一个完整的系统模块化,通过对各个模块互联,共同完成一个系统的工作.既然要做到模块化,那么必须明白你的系统的需求到底是什么 ...

  7. Work Queues

    Round-robin dispatching 默认情况下,RabbitMQ按顺序分发消息给下一个消费者.平均每个消费者会得到相同数量的消息. Message acknowledgment 为了确保消 ...

  8. Go语言下的线程模型

    阅读Go并发编程对go语言线程模型的笔记,解释的非常到,好记性不如烂笔头,忘记的时候回来翻一番,在此做下笔记. Go语言的线程实现模型,又3个必知的核心元素,他们支撑起了这个线程实现模型的主要框架: ...

  9. Spring Cloud微服务下的权限架构调研

    随着微服务架构的流行,系统架构调整,项目权限系统模块开发提上日程,需要对权限架构进行设计以及技术选型.所以这段时间看了下相关的资料,做了几个对比选择. 一.架构图 初步设想的架构如下,结构很简单:eu ...

  10. 【EF6学习笔记】(八)更新关联数据

    上一篇链接:EF学习笔记(七):读取关联数据 本篇原文链接:Updating Related Data 本篇主要考虑对于有关联的数据进行新增.删除.更新操作:比如Course .Instructor: ...