Git 回退操作详解:带示例的“小白”指南
前言
在日常开发中,我们难免会遇到:
- 改错代码:推送之前才发现某些行根本就不该动
- 提交错误:commit 信息打错、提交到错误分支
- 想回到之前版本:测试时发现之前版本是好的,需要回去查看
这就需要用到 Git 的回退操作。Git 提供多种回退方式,比如:checkout
、reset
、revert
、reflog
等。下面会从最常见的场景入手,一步步解释 怎么做 + 为什么这样做。
1. 概念简单区分
为了后面理解更顺畅,先做最简要的概念区分:
- 工作区(Working Directory):就是你平时编辑文件所在的那一层文件夹。
- 暂存区(Staging Area):你用
git add
之后,文件的修改就放到这里,等待下一次提交。 - 本地仓库(Local Repository):你执行
git commit
后,才真正存到本地仓库里。 - 远程仓库(Remote Repository):
git push
后,修改才会传到远程,比如 GitHub、GitLab 等。
不同的回退命令,操作作用在不同的阶段。
2. 撤销尚未提交的修改(还在工作区)
场景示例
你刚写完一段代码,突然发现完全写错了,还没来得及用
git add
。你想丢弃掉这一切。
命令
# 撤销当前工作区所有未提交的更改
git checkout -- .
或者,如果只想丢弃某个文件的更改:
git checkout -- <filename>
详解
checkout -- <文件>
会用最近一次提交中的版本覆盖你的工作区文件,达成“把文件回滚到上次提交状态”的效果。- 这时候,如果你还没有
git add
,那么这个命令就是最简单的丢弃本地改动方式。
3. 撤销已 git add
但未 commit
的修改
场景示例
你已经执行了
git add somefile.py
,但没执行git commit
。突然发现有些改动是不想提交的。
命令
- 先把文件从暂存区移回工作区:
git reset HEAD <filename>
- 再丢弃该文件在工作区的改动(如果还要丢弃的话):
git checkout -- <filename>
详解
git reset HEAD <filename>
:把<filename>
从暂存区撤回到工作区。git checkout -- <filename>
:丢弃工作区中的改动,回到上一次提交的状态。
如果你只是想取消暂存,但是保留文件的编辑(也许还想再改),那就只执行第一步即可。
4. 撤销最近一次提交:git reset
的用法
当你已经提交了 (commit),但你后悔了,比如提交漏写了某些文件、或者发现了语法错误,想重新来。
4.1 保留改动到工作区:--soft
“我想把最新一次提交退回,但代码还留着(我想再改改,之后重新提交)。”
git reset --soft HEAD~1
HEAD~1
表示上一个提交(也可以用 commit ID 的前几位代替)。--soft
会把那次提交的所有改动放回到“暂存区”,让你可以继续进行修改或重新提交。
4.2 完全丢弃改动:--hard
“我想彻底删除最近一次提交里的所有更改,干干净净回到上一个版本。”
git reset --hard HEAD~1
- 这会永久删除那次提交及其工作区更改,除非你通过
reflog
找回。 - 请谨慎操作:如果你需要的内容都没了,可能得不到恢复。
示例场景
- 你写了一个新功能,
git commit -m \"add new feature\"
。 - 结果发现写错功能逻辑,决定先回到不带该功能的旧版本去调试。
- 如果你还想保留这段代码,可以改良后再提交:
git reset --soft HEAD~1 # 现在那次提交的改动还在暂存区,你可以用编辑器继续修改 git commit -m \"fix new feature\"
- 如果你完全不想要那次提交,干脆删掉:
git reset --hard HEAD~1 # 彻底回到之前的版本
- 如果你还想保留这段代码,可以改良后再提交:
5. 撤销某一次特定提交:git revert
场景示例
你在历史上第 10 个提交里改了数据库配置,影响到现在的运行。想把那次提交撤销,但又不想影响中间其他 commits。
命令
git revert <具体的commit_id>
执行后,会自动开启一个编辑器让你写“撤销 xx 提交”的说明,然后自动生成一个新的提交,用以反向撤销指定版本的改动。
详解
git revert
不会改变原来的提交历史,而是生成一个“负向补丁”把之前提交的内容给抵消掉。- 这种做法最安全:不会打乱别人的历史,也不需要强制推送。团队协作中非常常用。
6. 想把本地回退同步到远程:强制推送 git push -f
场景示例
你在本地用
git reset --hard
回退到了一个老版本,然后希望远程仓库也回退。此时,如果直接git push
,Git 会拒绝,因为本地分支历史“比远程版本更旧”。
命令
git push origin <branch_name> --force
- 这会把远程仓库对应分支的提交历史整体替换成你本地的版本。
风险提示
- 一旦你强制推送,之前在远程的提交记录将被覆盖。
- 如果有其他人基于那几个被覆盖的提交做了工作,会引起冲突或混乱。
- 因此,强制推送前,一定先跟团队沟通。
7. 误操作后的救命绳:git reflog
场景示例
你一激动用
git reset --hard HEAD~2
结果发现需要的东西被删了。或者你已经 push -f 把远程也覆盖了……
命令
git reflog
会列出所有操作记录,包括 checkout
、commit
、reset
、merge
、rebase
等。你会看到一串记录,如:
a1b2c3d HEAD@{0}: reset: moving to HEAD~2
f6g7h8i HEAD@{1}: commit: add new feature
...
- 你可以找到需要的提交 ID,然后用:
或者git reset --hard <提交ID>
把那个版本再取出来。git checkout <提交ID>
详解
reflog
相当于 Git 的本地“操作历史日志”。只要本地没有执行更深度的清理(比如git gc --prune=now
),通常都能在reflog
找到过往的 commit。- 这是你“最后的后悔药”,别轻易乱删本地仓库!
8. 你可能关心的常见问题
- 已经 push 到远程的提交,能不能用 reset 撤销?
- 可以,但要用
push -f
强制推送,会影响其他人。所以一般用git revert
而不是reset
。
- 可以,但要用
git revert
和git reset
有啥区别?reset
是改变历史本身,“抹掉”提交;revert
是做一个新的提交来“抵消”之前提交的变化。revert
更安全,协作中更推荐。
- 能不能同时撤销多个提交?
- 可以:
git revert a1b2c3d..f6g7h8i
(如果中间需要处理冲突,也要人工处理)。不过要对 git revert 比较熟悉才行。
- 可以:
- 回退后发现我又需要那段代码,怎么办?
- 看看
reflog
能不能救。因为reset --hard
并不是真正销毁,除非被垃圾回收 (git gc) 清理。
- 看看
总结:回退操作一览表
需求场景 | 操作 | 风险性 |
---|---|---|
工作区未暂存的改动想丢弃 | git checkout -- <file> | 低 |
已暂存(但未提交)的改动想丢弃 | git reset HEAD <file> + git checkout -- <file> | 低 |
撤销本地最后一次提交,保留改动到工作区 | git reset --soft HEAD~1 | 相对可控 |
彻底删除最后一次提交,不保留改动 | git reset --hard HEAD~1 | 高,无法轻易恢复 |
撤销历史中某个特定提交(留下回滚记录) | git revert <commit_id> | 低 |
强制把回退操作更新到远程 | git push -f origin <branch> | 高,需沟通 |
查看所有本地操作日志,从中找到想恢复的 commit | git reflog | 无风险(只读) |
结束语
以上就是 Git 回退最常用的几种操作,结合了具体的使用场景和示例流程。作为新手,最重要的是:
- 明白回退命令改动的是哪些区(工作区、暂存区、本地仓库、远程仓库);
- 回退前先想清楚:自己是否真的要破坏历史?能不能用 git revert?
- 一旦强制推送,一定要先沟通;
- 误操作之后,别忘了
git reflog
。
希望这篇指南能帮助你在回退操作时更加从容,避免一些“万劫不复”的失误。祝你在开发中“一骑绝尘”、少踩坑、多出成果!
相关文章:
Git 回退操作详解:带示例的“小白”指南
前言 在日常开发中,我们难免会遇到: 改错代码:推送之前才发现某些行根本就不该动提交错误:commit 信息打错、提交到错误分支想回到之前版本:测试时发现之前版本是好的,需要回去查看 这就需要用到 Git 的…...
PyQt5库 各种导入项的作用
from PyQt5.QtCore import QIODevice, QSharedMemory, pyqtSignal 这行代码是从 PyQt5 库中导入了几个类和信号,用于开发桌面应用程序。下面是每个导入项的详细解释: QIODevice: QIODevice 是 PyQt5 中的一个类,提供了对输入输出设备的抽象…...
Git下载安装(保姆教程)
目录 1、Git下载 2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹…...
关系数据库设计理论
目录 一、数据依赖——重点 (1)平凡依赖/非平凡函数依赖 (2)完全/部分函数依赖 (3)传递函数依赖 二、范式(NF) (1)第一范式 (2)…...
图解LLM智能体(LLM Agents):构建与运作机制的全面解析
LLM智能体:构建与运作机制 LLM智能体(LLM Agents)正在迅速普及,似乎逐渐取代了我们熟悉的传统对话式LLM。这些令人惊叹的能力并非凭空而来,而是需要多个组件协同工作。 本文包含超过60张定制插图,将深入探讨LLM智能体的领域、其核心组件以及多智能体框架的工作原理。 文…...
Anaconda 入门指南
Anaconda 入门指南 一、下载安装 Anaconda 1、下载地址:Anaconda 推荐下载 python3 版本, 毕竟未来 python2 是要停止维护的。 2、安装 Anaconda 按照安装程序提示一步步安装就好了, 安装完成之后会多几个应用: Anaconda Navigtor :用于管…...
YOLOv11小白的进击之路(九)创新YOLO11损失函数之NWD损失函数源码解读
之前的博客也有对YOLO11的损失函数进行过源码分析,可以参考:YOLOv11小白的进击之路(六)创新YOLO的iou及损失函数时的源码分析_yolov11的损失函数是什么-CSDN博客最近在做小目标检测的时候注意到了NWD损失函数,这里对其…...
【c++】内存序 和 内存一致性模型
c 11 中为了支持并发,定义了内存序和内存一致性模型。这个概念听起来非常高深,好像是在多线程编程领域浸淫多年之后的神级程序员才能搞明白,并用明白的东西。 本文尝试用最简单的方式说清楚这个概念。因为这个概念真的超级简单,大…...
力扣128. 最长连续序列 || 452. 用最少数量的箭引爆气球
最长连续列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 输入:nums [100,4,200,1,3,2] 输出:4 解释&…...
从零开始写C++3D游戏引擎(开发环境VS2022+OpenGL)之十一点二五 光照贴图(lighting maps)的实现 细嚼慢咽逐条读代码系列
写在篇前的话 作为一个曾经在代码堆里面苦苦挣扎的萌新,困惑的事情在于库,各种依赖,包换文件,链接库,纠结于代码的作用意义。尤其在3D引擎开发的问题上,很多人都被各种困难给阻拦,放弃了在3D渲染,3D游戏引擎上大涨鸿图的机会。 当然关于3D游戏引擎的教程已经汗牛充栋…...
优先级队列(PriorityQueue)_1_模拟实现优先级队列
1、概念 前面介绍过队列,队列是一种先进先出(FIFO)的数据结构 ,但有些情况下, 操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列 ,这时候,使用队列显然不合适了。 在这种…...
java后端怎么写好根据角色控制查询不同数据,
z总的思路,先把不带查询条件的包含角色控制场景(比如:总公司经理角色可以查看所有数据,但是暂存的话只能查自己暂存的,分公司,只能查自己所属分公司的,)的所有数据查出来 例如查询的…...
《量子比特:AI复杂算法破局的关键力量》
在科技飞速发展的今天,人工智能(AI)与量子计算成为了推动人类进步的两大引擎。而量子比特,作为量子计算的基石,正逐渐展现出其在实现复杂AI算法时相较于传统比特的独特优势,为AI领域带来了前所未有的变革潜…...
MVC_Publish-Subscriber 模式中的事件处理程序
MVC_Publish-Subscriber 模式中的事件处理程序 MVC 中的事件处理:发布者-订阅者模式 程序启动时,controlRecipes将被传入addHandlerRender; addHandlerRender会侦听事件(addEventListener),并使用controlRecipes作为回调…...
RxSwift 学习笔记第四篇之RxSwift在项目中的简单应用
目录 前言 一、RxCocoa在项目中的用法 1.Target Action 2.代理 3.闭包回调 4.通知 二、一个计时器的例子 前言 在上面的两篇文章中,我们了解到了RxSwift中的Observable和Observer,本篇文章我们主要介绍下RxSwift项目中的使用。 一、RxCocoa在项目中的用法 RxCocoa 给 …...
Java面试黄金宝典2
1. 什么是 Concurrent 包 java.util.concurrent(简称 Concurrent 包)是 Java 5 引入的一个用于并发编程的工具包。它提供了一系列用于处理多线程编程的类和接口,帮助开发者更方便、安全地进行并发编程。 原理 该包基于 Java 的多线程机制和锁…...
【在数轴上找最优位置,使移动距离最短】
L1-4 破碎的心,无法挽回的距离 题目描述: YFffffff 最近在感情上遭受了失败,他的心也破碎成了n块碎片,散落在了数轴上的 n 个位置。 你是一个情感修复师,作为 YFffffff 的好友,你试图将这些破碎的心重新聚集到一个位…...
3D标定中的平面约束-平面方程的几何意义
平面方程的一般形式为 AxByCzD0,其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用:系数 A、B、C 构成的向量 (…...
singleInstance 和 singleTask的 重要 区别
singleInstance 和 singleTask 是 Android 中 Activity 的两种启动模式,它们主要用于控制 Activity 在任务栈中的行为。以下是两者的区别: 1. singleTask 定义: 每个 singleTask 模式的 Activity 在一个任务栈中只会存在一个实例。行为: 如果该 Activi…...
【如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南】
如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南 注册并获取硅基流动秘钥OpenWebUI中使用函数配置自定义模型-提示词配置效果验证 ) FLUX绘画是一种强大的AI绘图工具,本文将详细介绍如何在OpenWebUI中集成并使用FLUX绘画功能,…...
【Linux】浅谈环境变量和进程地址空间
一、环境变量 基本概念 环境变量(Environment Variables)是操作系统提供的一种机制,用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为: 程序可以通过环境变量获取配置信息,例如日…...
vue数字公式篇(一)
一、使用插件来创造数字公式 因为只是展示和编辑 我看这个公式挺多,也对公式不太了解所以就这样,开始我的代码展示了 1、安装mathlive cnpm install mathlive2、页面 <template><div><label>输入 LaTeX 公式:</label><div …...
基于PMU的14节点、30节点电力系统状态估计MATLAB程序
“电气仔推送”获得资料(专享优惠) 程序简介: 程序采用三种方法对14节点和30节点电力系统状态进行评估: ①PMU同步向量测量单元结合加权最小二乘法(WLS)分析电力系统的电压幅值和相角状态; …...
5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)
最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...
QT QML实现音频波形图进度条,可点击定位或拖动进度
前言 本项目实现了使用QT QML创建一个音频波形图进度条的功能。用户可以在界面上看到音频波形图,并且可以点击进度条上的位置进行定位,也可以拖动进度条来调整播放进度。可以让用户更方便地控制音频的播放进度,并且通过音频波形图可以直观地…...
浅谈StarRocks SQL性能检查与调优
StarRocks性能受数据建模、查询设计及资源配置核心影响。分桶键选择直接决定数据分布与Shuffle效率,物化视图可预计算复杂逻辑。执行计划需关注分区裁剪、谓词下推及Join策略,避免全表扫描或数据倾斜。资源层面,需平衡并行度、内存限制与网络…...
味觉传送器E-Taste:开启虚拟世界的味觉之门
味觉传送器E-Taste:开启虚拟世界的味觉之门 一、发明背景与动机 随着虚拟现实(VR)和增强现实(AR)技术的飞速发展,人们在虚拟世界中的沉浸感不断提升,视觉和听觉体验已经取得了显著的突破。然而…...
ISE 14.7 IP核 Block Memory Generator 更换coe
ISE 14.7 IP核 Block Memory Generator 更换coe 打开XCO 后缀,修改下面的coe_file 目录,并且重新regenerate ip 核即可...
【Auto-Scroll-List 组件设计与实现分析】
Auto-Scroll-List 组件设计与实现分析 gitee代码仓库 https://gitee.com/chennaiyuan/dayup-record/tree/master/%E4%B8%80%E4%BA%9B%E7%BB%84%E4%BB%B6/auto-scroll-list 1. 组件概述 我们封装的 AutoScrollList 是一个自动滚动列表组件,主要用于展示需要自动循…...
用hexo初始化博客执行hexo init时碰到的问题
用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…...
【C++真题】P1739 表达式括号匹配
P1739 表达式括号匹配 题目描述 假设一个表达式有英文字母(小写)、运算符(、-、*、/)和左右小(圆)括号构成,以 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配&#x…...
Java1.8与testNg兼容问题:bad class file和SocketTimeoutException: Read timed out
背景: 公司 java JDK默认用的是1.8版本,已经在跑的一个项目使用的testng用的是6.14.3,我拿到后通过Test 运行失败,因为这个是一直在用的项目,就没想到是版本兼容问题,折腾了好一阵(原开发者是通…...
高项第十二章——项目质量管理
项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求,以满足干系人目标的各个过程。 项目质量管理针对的是项目过程中所涉及的活动 可交付成果质量管理针对的是项目生产的具体可交付成果,与可交付成果的性质和特性紧密相关 12…...
C# WPF编程-Menu
C# WPF编程-Menu 布局:代码:效果 在WPF(Windows Presentation Foundation)中,Menu控件用于创建下拉菜单或上下文菜单,它提供了丰富的定制选项来满足不同的应用需求。下面将介绍如何在WPF应用程序中使用Menu…...
python日期
导入包 from datetime import datetime现在时间 now datetime.now() print("当前时间:", now)当前时间: 2025-03-18 23:51:08.418953 格式化 formatted_now datetime.now().strftime("%Y-%m-%d %H:%M:%S") print("格式化后的时间:", forma…...
flutter 专题 一百零三
前不久,谷歌官方正式发布了Flutter的首个发布预览版(Release Preview 1),这标志着谷歌进入了Flutter正式版(1.0)发布前的最后阶段,同时作为Google的重量级跨平台开发方案,此次更新也…...
【conda activate无效】 conda: error: argument COMMAND: invalid choice: ‘activate‘
conda activate失效了 在使用conda activate时出现报错: usage: conda [-h] [-v] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: activate (choose from clean, compare, config, create, info, init, install, list, notice…...
Chainlit 自定义元素开发指南:使用 JSX 和受限导入实现交互式界面
自定义元素 Custom Element 类允许你渲染一个自定义的 .jsx 代码片段。.jsx 文件应当放置在 public/elements/ELEMEN_NAME.jsx 目录下。 属性 name 字符串 自定义元素的名称。它应该与你的JSX文件名相匹配(不包括 .jsx扩展名)。 props 字典 传递给 JSX 的属性。 display El…...
CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些
一、前序知识 1、设置单进程模式,方便调试 void ClientApp::OnBeforeCommandLineProcessing(const CefString& process_type, CefRefPtr<CefCommandLine> command_line) {if (process_type.empty()){//cef 在debug模式下有问题#ifdef _DEBUGcommand_line->Appe…...
C++之list类及模拟实现
目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 (1)构造函数 (2)拷贝构造函数 (3)赋值运算符重载函数 (4)析构函数和clear成员函数 (5)尾…...
C++八大常见的设计模式的实现与实践指南
目录 创建型模式 单例模式工厂方法模式抽象工厂模式 结构型模式 适配器模式装饰者模式代理模式 行为型模式 观察者模式策略模式命令模式 高级主题 现代C特性影响模式性能对比典型应用案例 设计模式分类 一、创建型模式 1. 单例模式(Singleton) 现代…...
02 windows qt配置ffmpeg开发环境搭建
版本说明 首先我使用ffmpeg版本是4.2.1QT使用版本5.14.2我选择是c编译...
什么是状态管理?有何种方式可以实现?它们之间有什么区别?
目录 一、状态管理的核心概念 二、常见状态管理方案及对比 1. 基础方案:setState 2. 官方推荐:Provider 3. 事件驱动:Bloc (Business Logic Component) 4. 响应式增强:Riverpod 5. 轻量级全能库:GetX 三、方案对比与选型指南 四、实战建议 在 Flutter 中,状态管…...
tf1.x和tf2.x在使用上的区别和联系是什么
tf1.x和tf2.x在使用上的区别和联系是什么 TensorFlow 1.x 和 2.x 在使用上有显著差异,主要体现在编程范式、API 设计和易用性上,但二者仍共享相同的核心目标(深度学习框架)和底层计算引擎。以下是主要区别和联系: 主要…...
Elasticsearch使用记录
一、配环境 1.docker版本部署es 8.x系列可以关掉ssl(本地测试时),去docker的/usr/share/elasticsearch/config/elasticsearch.yml里面的“xpack.security.enabled:”设置成true就可以 2.window docker部署推荐教程:基于Docker安…...
【python web】一文掌握 Flask 的基础用法
文章目录 一、 Flask 介绍1.1 安装 Flask二、Flask的基本使用2.1 创建第一个 Flask 应用2.2 路由与视图函数2.3 请求与响应2.4 响应对象2.5 模板渲染2.6 模板继承2.7 静态文件管理2.8 Blueprint 蓝图2.9 错误处理三、Flask扩展与插件四、部署 Flask 应用五、总结Flask 是一个轻…...
第十六届蓝桥杯单片机组4T模拟赛二
难点: PCF8591同时测量两条通道数据 避免重复触发 采集触发时的时间数据存放 未采集的数据显示 清空数据 本题建议了解怎么去触发采集,怎么显示最近三次触发采集的时间即可。由于4T模拟赛的尿性有很多评测点是题目中没有要求的,另外测评的时候…...
《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》
在数字化浪潮汹涌澎湃的当下,人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋,其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目,开启了智能生态的新篇章。 华为MindSpore:AI框架的创新先锋…...
kotlin中的list set map整理
在 Kotlin 中,List、Set 和 Map 是三种核心集合类型,它们分别适用于不同的场景,具有独特的特性和操作方式。以下是它们的详细对比与使用指南: 1. List(列表) 核心特性 • 有序:元素按插入顺序…...
条款43:学习处理模板化基类内的名称
前提认知:模板类继承模板类,是需要建立在假设的前提下的,如果没有这个”假设“,编译将会失败 1.书上举例 2.完整代码举例 #include <iostream>class MsgInfo { };class BaseCompany { public:BaseCompany(){}~BaseCompan…...