git revert讲解

2023-11-18

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 checkout -- .       # 丢弃全部

注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。

2、代码git add到缓存区,并未commit提交

git reset HEAD .  或者
git reset HEAD a.txt

这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化

3、git commit到本地分支、但没有git push到远程

git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>  # 回到其中你想要的某个版
或者
git reset --hard HEAD^  # 回到最新的一次提交
或者
git reset HEAD^  # 此时代码保留,回到 git add 之前

4、git push把修改提交到远程仓库
1)通过git reset是直接删除指定的commit

git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除

2)通过git revert是用一次新的commit来回滚之前的commit

git log # 得到你需要回退一次提交的commit id
git revert <commit_id>  # 撤销指定的版本,撤销也会作为一次提交进行保存

3) git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除

开发过程中,你肯定会遇到这样的场景:

场景一:

糟了,我刚把不想要的代码,commit到本地仓库中了,但是还没有做push操作!

场景二:

彻底完了,刚线上更新的代码出现问题了,需要还原这次提交的代码!

场景三:

刚才我发现之前的某次提交太愚蠢了,现在想要干掉它!

撤销

上述场景一,在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”!

情况一:文件被修改了,但未执行git add操作(working tree内撤销)


   
   
  1. git checkout fileName
  2. git checkout .

情况二:同时对多个文件执行了git add操作,但本次只想提交其中一部分文件


   
   
  1. $ git add *
  2. $ git status
  3. # 取消暂存
  4. $ git reset HEAD <filename>

情况三:文件执行了git add操作,但想撤销对其的修改(index内回滚)


   
   
  1. # 取消暂存
  2. git reset HEAD fileName
  3. # 撤销修改
  4. git checkout fileName

情况四:修改的文件已被git commit,但想再次修改不再产生新的Commit


   
   
  1. # 修改最后一次提交
  2. $ git add sample.txt
  3. $ git commit --amend -m "说明"

情况五:已在本地进行了多次git commit操作,现在想撤销到其中某次Commit

git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
   
   

具体参数和使用说明,请查看:Git Pro深入浅出(二)中的重置揭秘部分

回滚

上述场景二,已进行git push,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!

如果你每次更新线上,都会打tag,那恭喜你,你可以很快的处理上述场景二的情况

git checkout <tag>
   
   

如果你回到当前HEAD指向

git checkout <branch_name>
   
   

情况一:撤销指定文件到指定版本


   
   
  1. # 查看指定文件的历史版本
  2. git log <filename>
  3. # 回滚到指定commitID
  4. git checkout <commitID> <filename>

情况二:删除最后一次远程提交

方式一:使用revert


   
   
  1. git revert HEAD
  2. git push origin master

方式二:使用reset


   
   
  1. git reset --hard HEAD^
  2. git push origin master -f

二者区别:

  • revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
  • reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

情况三:回滚某次提交


   
   
  1. # 找到要回滚的commitID
  2. git log
  3. git revert commitID

删除某次提交

git log --oneline -n5
   
   

Git撤销&回滚操作-log

git rebase -i "commit id"^
   
   

注意:需要注意最后的^号,意思是commit id的前一次提交

git rebase -i "5b3ba7a"^
   
   

Git撤销&回滚操作-rebase

在编辑框中删除相关commit,如pick 5b3ba7a test2,然后保存退出(如果遇到冲突需要先解决冲突)!

git push origin master -f
   
   

通过上述操作,如果你想对历史多个commit进行处理或者,可以选择git rebase -i,只需删除对应的记录就好。rebase还可对 commit 消息进行编辑,以及合并多个commit。

出自此处,请点击!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git revert讲解 的相关文章

  • CSDN的常用技巧(字体、颜色、大小、类型、背景标记、删除、居中)

    CSDN的常用文本设置 字体 颜色 大小 类型等 一 字体设置 二 绘制表格 三 下划线 四 首行缩进 五 设置插入图片的大小 六 空格 七 黑点 八 背景标记 删除文本 九 文字居中 一 字体设置 CSDN Markdown编辑器对字体设
  • 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]

    基于HOG特征的SVM分类器实现 在机器学习领域 支持向量机SVM Support Vector Machine 是一个有监督的学习模型 通常用来进行模式识别 分类 以及回归分析 方向梯度直方图 Histogram of Oriented
  • 微信远程代码执行漏洞(最新版本利用)-亲测已上线

    目录 POC index html exp js 测试总结 最新版微信利用方式 最新版存在 web安全学习了解 web渗透测试 官网 宣紫科技 POC index html exp js ENABLE LOG true IN WORKER
  • 使用python将视频切分为图片

    coding UTF 8 import cv2 import numpy as np import random import os 定义保存图片函数 image 要保存的图片名字 addr 图片地址与相片名字的前部分 num 相片 名字的
  • python 删除两个文件中没有一一对应的名称

    删除两个文件中没有一一对应的名称 针对于 jpg文件和xml文件没有对齐 usr bin python3 coding UTF 8 import os import shutil file name 1 JPEGImages 图片文件存放地
  • 生成带有目录的Markdown格式文档

    什么是Markdown Markdown 是一种轻量级的 标记语言 它的优点很多 目前也被越来越多的写作爱好者 撰稿者广泛使用 使用 Markdown 的优点 专注你的文字内容而不是排版样式 轻松的导出 HTML PDF 和本身的 md 文
  • 追踪邮件发送者的地理位置

    今天偶然发现Gmail可以追踪发送者的IP位置 于是忍不住跃跃欲试 邮件不只有文本内容 还有额外的信息在每个邮件的header里面 一般的邮件客户端都是不能查看header的 Gmail和雅虎邮箱可以 网易邮箱的查看信头也能实现 打开Gma
  • 【看后必会】一步步教你用React写一个markdown实时编辑器!

    1 实现效果 最近在用React写一个博客管理系统 有一个功能是添加新文章 在新建文章的页面 我希望做到像CSDN这样 左边是编辑区 markdown格式 右边是预览区 实时更新 编辑文本的同时 在预览区就能看到效果 就自己动手实现了一个这
  • 2021经典优秀计算机单片机毕业设计题目

    可追溯农产品电商管理系统的设计与实现 农产品用户商城系统设计与实现 基于OpenGL的全局光照算法的设计与实现 分布式存储系统分析与设计 基于机器学习的数据库融合技术研究 基于知识图谱的对话系统设计与实现 具有日志的虚拟WEB攻防系统设计与
  • 修改网站图标以apache tomcat为例

    路径在 opt apache tomcat 9 0 6 webapps ROOT 把该路径下的favicon ico文件换成自己的 名字必须也是要favicon ico
  • simple and useful command lines

    pip list grep package name 显示获取已安装包的信息 包名与版本号 pip show package name 能显示该安装的包的相关信息 其中包括它的安装路径 实际上包通常被安装在python安装目录下的lib s
  • [C++11]std::promise

    一 std promise介绍 std promise 是C 11并发编程中常用的一个类 常配合std future使用 其作用是在一个线程t1中保存一个类型typename T的值 可供相绑定的std future对象在另一线程t2中获取
  • 遇到的debug整理20190107

    已解决 最后的链结失败 错误的值 RT0 o relocation R X86 64 PC32 against symbol phgTetFaceVertexi can not be used when making a shared ob
  • LCD操作原理

    一 LCD原理介绍 LCD内部内部结构 1 lcd由Framebuffer lcd屏幕 信号线 电子枪 lcd控制器组成 2 Framebuffer提供显示数据 lcd屏幕显示 信号线传输Frambuffer中的数据和lcd控制器发出的信号
  • 使用python进行文件夹重命名

    import os file name JPEGImages 文件存放地址 count 0 for file in os listdir file name os rename os path join file name file os
  • sonar scanner配置

    sonar scanner配置 这里记录如何配置sonar scanner扫描C C 项目代码 话不多说 先上官网链接 文章目录 sonar scanner配置 1 环境 1 1 SonarSource Build Wrapper 1 2
  • 安装VS2019 提示 Visual C++ 2015-2019 x64 redistributable安装失败

    最近安装VS2019和UE4的时候总是弹出提示框 忘记截图了 找了张类似的 点击OK之后会弹出下面的对话框 度娘给出茫茫多的解决方案 大部分都是说缺少vc 2015或者vc 2017的相应库 需要先安装低版本库 试了大半天都不能解决 吐血
  • visual studio code 2019远程连接服务器

    一 安装sftp 二 配置sftp 按住ctrl ship p键 得到以下画面 选择SFTP Config 当右下角出现 意思时需要一个文件夹 点击open folder后 选择或者创建一个文件夹 再回来按住ctrl shif p就会看到一
  • 基于内容的视频信息检索系统

    基于内容的视频信息检索系统 汪志强 江西财经大学信息管理学院 09信息管理与信息系统2班 摘 要 本文从基于内容的视频信息检索技术的发展历史出发 对基于内容的视频检索系统的技术要点及主要的功能模块进行了讨论和分析 并说明了当今技术存在的缺陷
  • git revert讲解

    git的工作流 工作区 即自己当前分支所修改的代码 git add xx 之前的 不包括 git add xx 和 git commit xxx 之后的 暂存区 已经 git add xxx 进去 且未 git commit xxx 的 本

随机推荐

  • 【Linux-进程通信1】管道

    进程间通信介绍 进程间通信目的 在操作系统中 每个进程都是独立运行的 它们有自己的地址空间和资源 它们不能直接访问其他进程的资源 然而 在现代计算机系统中 很少有一个进程能够独立完成所有任务 因此需要不同的进程之间进行通信和协作 进程间通信
  • Linux中Ubuntu卡顿问题解决

    解决vmware虚拟机速度慢的3种方法 使用vmware虚拟操作系统的好处不用多说 但如果虚拟机运行速度十分缓慢 正常使用很卡的话是很痛苦的 本文介绍了3种提高虚拟机运行速度的方法 都是古意人实际操作过的方法 效果显著 推荐大家一试 1 给
  • 【复习】软考中级_软件设计师(2021)__上午

    前言 1 总想瞎bb点什么内容 2 自己复习的笔记 分享大家一起使用 3 可能有错误请指教 4 对于有些基础内容进行省略 5 适合等公交 摸鱼 无聊的时候观看 6 技术有限 哪里出错误了请指教 十分感谢 一 计算机组成与结构 数据的转换 1
  • 【C++ Primer 第五版】 目录-第Ⅰ部分

    序言和前言 第一章 开始 1 1 编解一个简单的C 程序 1 1 1 编译 运行程序 1 2 初识输入输出 1 3 注释简介 1 4 控制流 1 4 1 while 语句 1 4 2 for语句 1 4 3 读取数量不定的输入数据 1 4
  • 【Python】赋值、浅拷贝与深拷贝(附图解)

    Python 赋值 浅拷贝与深拷贝 附图解 Python的变量 可变对象与不可变对象 可变对象 不可变对象 赋值 浅拷贝与深拷贝的区别 可变对象的赋值 浅拷贝与深拷贝 赋值 浅拷贝 深拷贝 不可变对象的赋值 浅拷贝与深拷贝 结论 Pytho
  • xml文件修改后,git提交,变更列表中没有xml文件

    小编通过ctrl shift R找到需要修改的xml文件 修改后git提交 变更列表中没有 经过同事提醒 发现自己修改的是编译的xml文件 所以git提交 变更列表中没有xml文件 解决方法 找到Dao层下的xml文件进行修改 git提交变
  • matlab空间马尔可夫链式,基于MATLAB操作的马尔可夫链蒙特卡罗方法(MCMC)

    1 Sampling from Random Variables 4 1 1 Standard distributions 4 1 2 Sampling from non standard distributions 7 1 2 1 Inv
  • 边缘云与中心云_云与边缘的工业制造困境

    边缘云与中心云 Typically Deep Learning the subspecies of AI application that have gained the spotlight in the past few years th
  • *SVN从服务器新建本地库2021-10-18

    SVN从服务器新建本地库 1 如图打开版本库浏览器 2 在右侧空白处新建文件夹 3 选中文件夹右键检出 后续按照提示选择自己指定的本地文件夹位置即可 后面就可以跟服务器上传和下拉了
  • 20180726:Mac中文件.DS_store的隐藏与开启

    简介 DS store是存储文件夹属性的文件 1 开启 打开终端 键入命令 defaults write com apple finder AppleShowAllFiles YES defaults write com apple fin
  • ref 在 React 中的使用方法和说明

    react标签中ref的写法在 React 中 ref 属性用于引用组件中的某个元素或组件实例 以便在需要时对其进行操作 ref 属性的应用场景很多 比如直接访问 DOM 节点 管理 focus 状态 嵌套子组件等等 下面 我们来详细了解一
  • 递归求逆序

    Description 输入多行文字 输出其逆序 Input 多个文字 Output 其逆序 Sample Input 1 abcd wdwe Sample Output 1 ewdw dcba Hint int main recursiv
  • Qt5自定义状态栏QStatusBar外观(背景)和状态栏基本用法(显示普通消息、临时消息、永久消息)

    本文主要总结Qt状态栏QSatatuBar用法 通过继承状态栏 自定义状态栏背景图形 以及状态栏三种基本用法 状态栏类QStatusBar主要有显示普通消息 显示定时消息 显示永久消息三种功能 三种都十分常用 下面先总结自定义状态栏外观用法
  • 【JavaScript】正则表达式 VS 正规式

    在看JS之前没有怎么接触过正则表达式 只是知道有这么个东西 而在软考学习的时候 在编译原理这块有一个正规式 当时只知道这两个东西不是一个概念 具体哪里不同不太清楚 现在正好学到这里了 在此对比总结一下 一 正规式 一种表示正规集的工具 正规
  • 飞马D2000 激光雷达LVX数据文件解析

    解析出来的结果如下图
  • LVGL V9.0基于VS2022仿真搭建(2)

    完整Demo lvgl lvgl drivers相关资料下载 链接 https pan baidu com s 1h3OKCIBQRX0Hn7KjZsynqg 提取码 sc2l 下载的lv drivers中的win32drv c及win32
  • 云链商城连锁门店新零售O20系统以零售商城

    云链商城连锁门店新零售O20系统以零售商城 门店收银 多渠道进销存 客户管理 互动营销 导购助手 多种奖励模式和数据分析等功能 赋能多品牌连锁门店实现线上线下商品 会员 场景的互联互通 助推企业快速实现营销 服务 效率转型升级 为实体零售企
  • Idea中Java项目修改项目名

    1 修改项目文件夹名称 下面是在Idea中改 也可以直接找到项目文件夹重命名 2 关闭项目 Idea会默认生成原项目名的文件夹 将其删除 3 导入重命名后的项目文件夹 4 导入成功后 在Idea中修改模块名称 大功告成 修改项目名总共有三处
  • 【Java】用do-while循环,实现猜数字。

    package TcmStudy day05 import java util Scanner public class DoWhileText01 public static void main String args Scanner i
  • git revert讲解

    git的工作流 工作区 即自己当前分支所修改的代码 git add xx 之前的 不包括 git add xx 和 git commit xxx 之后的 暂存区 已经 git add xxx 进去 且未 git commit xxx 的 本