问题描述:

我们用 git 在单人或者多人开发的时候,有时候出现的 错误的提交 ,我们此时 撤销 之前的操作,回退、回滚 到之前的版本,这里总结了 2种方法:reset(删除错误提交) 和 revert(新建提交覆盖)

图解 reset 和 revert 区别

1.reset 删除错误的提交记录

reset :删除错误的提交记录,(用于回滚版本、合并简化多余的提交记录)

例如:回退到 version2

例如:将 HEAD 指针指向 version2 的版本,删除后面的版本

因为是退回到之前的版本,所以这个需要强制 push :git push origin master:master -f

reset 有 4 中不同的类型,–hard、–soft、–mixed、–keep。上述介绍的是 --hard 强制类型,详情在拓展中了解。

2. revert 创建新的提交记录,覆盖错误版本

revert:以 version2 为基础新建提交记录,覆盖之前的错误的代码,但是错误的提交记录还在。

(用于回滚版本,并保存是哪个傻子提交了错误的代码的记录)

(方式1)git 命令行解决

1. reset

使用 reset 从 version4 回滚到 version2

不同版本的 README.md 文件如下

1.1.查看提交记录

GitHub 查看提交记录

本地提交记录

git log

1.2 reset 回滚到 version2

de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad 是 version2 的版本号)

git reset --hard de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad

1.3 强制 push

git push origin master:master -f

GitHub 查看提交记录,目标版本之后的提交全部消失了

本地查看提交记录,目标版本之后的提交全部消失了

git log

2. revert

git revert 是建立新的提交,覆盖错误的版本,会记录下是那个傻子提交了错误的代码

目标:从 version4 回滚到 version2

2.1 查看目前版本

GitHub 查看

本地查看

git log

2.2 git revert 回滚

git revert -n de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad^..HEAD
  1. -n 是代表不自动提交,只是将回滚的代码添加到,暂存区(效果类似 git add),因为 revert 默认是回滚一个版本,如果自动提交,最后的代码会变成 verson1 – version2 – version3 – version4 – revert-to-version3 – revert-to-version2 会生成2个commit 记录,所以,一般都要使用 -n(也写作 --no-commit) 这个参数,更多信息可以参考文章后面的拓展链接

  2. HEAD 代表的是目前的状态缩写代表,同理于 298241a046a3781c73c169c933f5539e0e198351

  3. ^.. 代表是范围 revert ,因为 revert 是一个一个 revert 的,格式是 OLD_COMMIT_ID^…NEW_COMMIT_ID ,旧的提交记录在前面

理解 revert 多个提交

(没有输出就是成功,如果出现异常可以看看下面的问题和解决)

查看:

(1)查看文件,本地文件已经回滚到了 version2

2.3 提交文件

git commit -m "revert-to-version"
git push origin master:master

查看:

本地查看

git log

查看 GitHub

(方式2)IDEA 界面操作

其实 IDEA 这种图形化操作其实更方便,请确保你安装 Git 插件,

下面的操作都是将 version4 的版本回滚到 version2

1. reset

1.1 Alt + 9 查看 git Log

1.2 reset 回滚到 version2

右键单击 version2 记录,然后选择 Reset Current Branch to Here…

1.3 选择 Hard 模式

后面拓展会详细讲 4 中模式的区别

1.4 提交

hard 强制 reset 之后的结果如下

强制 push

因为你本地的 git 代码 的版本 version2 低于远程 version4 ,所以普通 push 会失败,这里只有强制 push

Ctrl + Shift + K push代码(也可以右键,选择 Git -> Repostory -> Push )

但是如果你像我一样看到 Force Push 是灰色的,应为IDEA 更新后不支持在 master 分支上 强制 push

来自 StackOverFlow:

As far as issue 85773 is concerned, that option shouldn’t be in the GUI yet (for IDEA 11-12 or 13+).
And it would be disabled when on the master branch.

但是你可使用命令强制 push

git push origin master:master -f

push 结束后在 GitHub 中看看

2. revert

我们回到最初的起点

2.1 Alt + 9 查看 Git Log

GitHub 的 Commit 提交记录

4.2 revert 重做 version2

右键单击 version2 记录,然后选择 Revert Commit

4.3 (重点) 选择 merge

选择 MERGE 你的本地的文件才会回到 version2 的版本,ACCEPT YOURS 不会回到之前版本

push 代码(因为你的代码的版本是递增的,不会删除已经推送到远程的分支,所以可以普通 push)

快捷键 Ctrl + Shift + K

查看 GitHub commit 记录

(拓展) 4 种 git reset 详解

可以参考这篇文章:Git Reset 三种模式 - 简书 (jianshu.com)

参考:

Git Reset 三种模式 - 简书 (jianshu.com)

(14条消息) Git恢复之前版本的两种方法reset、revert(图文详解)_游笑天涯-CSDN博客_git revert

常见问题和解决

1. git revert 错误

报错信息如下

# git revert -n de9cf03fb023a8ae6f294b31ae3f7ebfd6c0e0ad^..HEAD
README.md: unmerged (ae62d700d653021c24138215ac9f4e791a921b56)
README.md: unmerged (e5a4c368e4b9131d170893a69c8b69bf50438606)
README.md: unmerged (e9582e4fdfa9384de9e52e75c80ee42e5c8cc169)
error: your index file is unmerged.
fatal: revert failed

error: could not revert de9cf03… version2

git 代码回滚 reset revert 详解 IDEA操作 4种reset区别相关推荐

  1. linux git 删除分支,git 删除分支和回滚的实例详解

    linux shell 的 git 删除分支和回滚的实例详解 git 删除分支和回滚的实例详解 [git 删除本地分支] git branch -D br [git 删除远程分支] git push ...

  2. mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...

  3. Git学习总结(19)——Git代码回滚总结

    一.Git代码回滚分为两种情况,分别是push前回滚和push后回滚. 二.push前代码回滚 push前代码回滚使用reset命令,形如:git reset [--soft | --mixed | ...

  4. git 代码回滚_git代码版本管理(1)——git版本回滚

    git代码版本管理(1)--git版本回滚 1.问题背景 在利用github.gitlab.Gitee等代码管理器中对代码的管理,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提 ...

  5. git代码回滚的几种方式

    这还是第一次写关于git的文章,让我不由的想起了大学那会还没有接触到git时的如噩梦般的版本控制. 每次如果代码要有大的改动都要提前copy一份出来,最后以至于有多少次大的改动就有多少分文件,而且每一 ...

  6. git 代码回滚_能提交到远程的Git回滚

    很多情况下我们需要回滚代码,最容易想到的就是git reset.但是git reset有个弱点,它是一个彻底的回滚,不能再提交给远程了,因为在提交记录里回滚点之后的记录都不见了. 做一下试验,一个文件 ...

  7. git 代码回滚_谁说用 Git 一定要用命令行?试试 SourceTree 吧

    作者:邵磊http://juejin.im/post/59bc944d51882519777c5e07 整理:后端技术精选 前言 作为使用Sourcetree大于3年的我,已熟知git的每一个功能,并 ...

  8. git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!

    点击蓝色小字关注! 关注一下你就不会有bug!合并操作 相对于常规的 commit,当使用 git merge 合并两个分支的时候,你会得到一个新的 merge commit. 当我们 git sho ...

  9. idea中git代码回滚

    第一步:找到VCS->Git->Show History 第二步:右键复制版本号: 第三步:找到 Git->Reset HEAD: Reset Type 有三种: mixed 默认方 ...

最新文章

  1. (转)Unity中武器与人物的碰撞检测
  2. 2016.01.19 UITextField
  3. python第三方库排行-Python模块汇总(常用第三方库)
  4. Fedora安装Nvidia显卡驱动方法
  5. 技术 KPI 的量化
  6. 如何将Windows 10帐户还原为本地帐户(在Windows Store劫持它之后)
  7. OpenLiberty:注入时出错,适用于TomEE和Wildfly
  8. python loggeru模块_python常用模块——logger模块
  9. Apple’s current market value is more than two trillion
  10. 如何在virtualenv环境中安装指定的python版本
  11. Git工程区域与文件状态
  12. 社交APP软件开发流程解析
  13. 【机器人算法】机器人动力学参数辨识
  14. TU-768与IT180A对比分析报告
  15. 人眼中的光 —— 光强,光通量,光照度,光亮度是什么
  16. TortoiseSVN安装失败——Please install the universal CRT first
  17. 场效应三极管及其放大电路(1)MOSFET详解
  18. 对页面上所有ajax的请求进行监听
  19. Java 校验注解的使用、自定义校验注解
  20. 利用c++与opencv将文本、图像加密进另一张图片中

热门文章

  1. IDEA代码警告(warning)整理以及解决办法
  2. 数仓维度建模之维度表技术基础
  3. 网商银行年营收139亿:净利20.9亿 蚂蚁集团持股30%
  4. 新网银行年营收26亿:净利9亿 远逊色于微众与网商银行
  5. MySQL之is not null, not in优化
  6. 分布估计算法java_数理统计8:点估计的有效性、一致最小方差无偏估计(UMVUE)、零无偏估计法...
  7. 计算机专业教育教育课程心得,教育信息技术2.0学习心得感悟
  8. Python-Django毕业设计葡萄酒销售管理系统论文(程序+Lw)
  9. [音乐欣赏]为你读诗背景音乐,音乐电台
  10. Android Activity生命周期一探究竟 及 主Activity里带Thread跳转时的注意事项