Git 回退操作详解:带示例的“小白”指南

news2025/3/19 16:20:18

前言

在日常开发中,我们难免会遇到:

  • 改错代码:推送之前才发现某些行根本就不该动
  • 提交错误:commit 信息打错、提交到错误分支
  • 想回到之前版本:测试时发现之前版本是好的,需要回去查看

这就需要用到 Git 的回退操作。Git 提供多种回退方式,比如:checkoutresetrevertreflog 等。下面会从最常见的场景入手,一步步解释 怎么做 + 为什么这样做


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。突然发现有些改动是不想提交的。

命令

  1. 先把文件从暂存区移回工作区:
    git reset HEAD <filename>
    
  2. 再丢弃该文件在工作区的改动(如果还要丢弃的话):
    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 找回。
  • 请谨慎操作:如果你需要的内容都没了,可能得不到恢复。

示例场景

  1. 你写了一个新功能,git commit -m \"add new feature\"
  2. 结果发现写错功能逻辑,决定先回到不带该功能的旧版本去调试。
    • 如果你还想保留这段代码,可以改良后再提交:
      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

会列出所有操作记录,包括 checkoutcommitresetmergerebase 等。你会看到一串记录,如:

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. 你可能关心的常见问题

  1. 已经 push 到远程的提交,能不能用 reset 撤销?
    • 可以,但要用 push -f 强制推送,会影响其他人。所以一般用 git revert 而不是 reset
  2. git revertgit reset 有啥区别?
    • reset 是改变历史本身,“抹掉”提交;revert 是做一个新的提交来“抵消”之前提交的变化。revert 更安全,协作中更推荐。
  3. 能不能同时撤销多个提交?
    • 可以:git revert a1b2c3d..f6g7h8i (如果中间需要处理冲突,也要人工处理)。不过要对 git revert 比较熟悉才行。
  4. 回退后发现我又需要那段代码,怎么办?
    • 看看 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>高,需沟通
查看所有本地操作日志,从中找到想恢复的 commitgit reflog无风险(只读)

结束语

以上就是 Git 回退最常用的几种操作,结合了具体的使用场景和示例流程。作为新手,最重要的是:

  1. 明白回退命令改动的是哪些区(工作区、暂存区、本地仓库、远程仓库)
  2. 回退前先想清楚:自己是否真的要破坏历史?能不能用 git revert?
  3. 一旦强制推送,一定要先沟通
  4. 误操作之后,别忘了 git reflog

希望这篇指南能帮助你在回退操作时更加从容,避免一些“万劫不复”的失误。祝你在开发中“一骑绝尘”、少踩坑、多出成果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 引入element-plus组件后,发现输入的时候没有提示,而且鼠标移到el-button显示unknown的简单解决方法

1、element-plus官方地址 一个 Vue 3 UI 框架 | Element Plus 2、安装 安装 | Element Plus 3、安装插件unplugin-vue-components、unplugin-auto-import并配制 快速开始 | Element Plus 4、输入关键词没有提示及ElButton:unknown的处理 1&#xff09;装个扩展插件&#xf…

【Linux】浅谈环境变量和进程地址空间

一、环境变量 基本概念 环境变量&#xff08;Environment Variables&#xff09;是操作系统提供的一种机制&#xff0c;用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为&#xff1a; 程序可以通过环境变量获取配置信息&#xff0c;例如日…

如何使用 DeepEval 优化 Elasticsearch 中的 RAG 检索

作者&#xff1a;来自 Elastic Kritin Vongthongsri 学习如何使用 DeepEval 优化 RAG 流水线中的 Elasticsearch 检索器。 LLMs 容易产生幻觉、缺乏特定领域的专业知识&#xff0c;并受限于上下文窗口。检索增强生成&#xff08;Retrieval-Augmented Generation - RAG&#xff…

行为模式---状态模式

概念 状态模式是一种行为模式&#xff0c;用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类&#xff0c;并将其行为委托给当前的状态对象&#xff0c;从而使得对象行为随着状态…

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计 792125321入群学习更高效&#xff01; 在MCU&#xff08;微控制器单元&#xff09;裸机开发中&#xff0c;我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式&#xff0c;对我们开发一个小型项目来说及有好处&#xff01; 下面介绍…

【LInux进程六】命令行参数和环境变量

【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一&#xff1a;PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…

激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录

背景&#xff1a;mars实验室又发福利啦&#xff01;跑跑效果&#xff0c;验了那句&#xff0c;mars出品&#xff0c;必属精品&#xff01;本人pc环境ubuntu20.04&#xff0c;基本流程按照readme走就行&#xff0c;sophus和vikit安装有些注意地方。本文做了一些部署踩坑记录&…

织梦DedeCMS优化文章模版里的“顶一下”与“踩一下”样式

测试的版本5.7.1UTF-8 一、插入<head>Js代码 将下面代码插入到文章模版里的<head>标签里 <script language"javascript" type"text/javascript" src"{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script> <…

IDEA+Docker插件一键部署SpringBoot项目到远程服务器

文章目录 1. 服务端1.1 安装Docker1.2 Docker放开远程连接1.3 重启Docker1.4 开放端口1.4.1 云端1.4.2 服务器内部防火墙指令 2.IntelliJ IDEA2.1 安装IDEA2.2 安装Docker插件2.3 SSH Configurations2.4 Docker选择对应的SSH2.5 Dockerfile2.5.1 Dockerfile2.5.2 Dockerfile Ed…

C++基础 [五] - String的模拟实现

目录 前言 string类的模拟实现 成员函数的实现 构造函数 拷贝构造函数 赋值运算符重载 析构函数 元素访问的实现 operator[ ] Iterator - 迭代器 容量大小的实现 size capacity reserve ​编辑resize 内容修改的实现 push_back append operator(char ch) …

AIAgent有哪些不错的开源平台

AIAgent领域有许多优秀的开源平台和框架&#xff0c;以下是一些值得推荐的开源平台&#xff1a; AutoGPT AutoGPT 是一个基于 OpenAI 的 GPT-4 和 GPT-3.5 大型语言模型的开源框架&#xff0c;能够根据用户给定的目标自动生成所需提示&#xff0c;并利用多种工具 API 执行多步骤…

Python刷题:流程控制(上)

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 每一个拼命努力的人&#xff0c;都像是独自穿越黑暗森林的行者&#xff0c; 没有并肩的身影&#xff0c;唯有孤独如影随形&…

vulhub/Billu_b0x靶机----练习攻略

1.Billu_b0x靶场下载链接&#xff1a; https://download.vulnhub.com/billu/Billu_b0x.zip 2.下载后&#xff0c;解压出ova文件&#xff0c;直接拖至VMware中&#xff0c;重命名和选择存储位置&#xff0c;点击导入&#xff0c;报错点击重试即可。修改网卡为NAT模式。 打开靶…

【YOLOv8】YOLOv8改进系列(8)----替换主干网络之Swin Transformer

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…

Qwen2-Audio:通义千问音频大模型技术解读

引言:从llm到mlm(audio) 大型语言模型(LLM)的发展日新月异,它们在文本理解、生成、推理等方面展现出惊人的能力。然而,交互模态不仅仅依赖于文字,语音、语调、环境音等听觉信息同样承载着丰富的内容。阿里巴巴通义千问团队,推出了 Qwen-Audio 系列模型,这里我们一起…

解决Java多张图合成JPG时出现红色前景及多列自适应适配

目录 前言 一、追本溯源 1、回到最开始 2、合成JPG的异常 二、解决问题 1、关于ImageType 2、TYPE_INT_RGB和TYPE_INT_ARGB 3、问题修复 4、列数自适应的问题 三、总结 前言 在当今数字化信息飞速发展的时代&#xff0c;图像处理技术在各个领域都占据着举足轻重的地位…

SpringBoot实现发邮件功能+邮件内容带模版

发送简单邮件模版邮件 1.pom引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.5.13</version></dependency><dependency><groupId&…

npm 报错 unable to resolve dependency tree

如下图&#xff1a; 解决&#xff1a;npm install --legacy-peer-deps 其实提示上有&#xff1a;npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps

【蓝桥杯每日一题】3.17

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 他们说内存泄漏是bug&#xff0c;我说这是系统在逼我进化成SSR级程序员 OK来吧&#xff0c;不多废话&#xff0c;今天来点有难度的&#xff1a;二进制枚举 二进制枚举&#xff0c;就是…

Linux:冯诺依曼体系结构、操作系统、进程概念(一.初识进程)

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数&#xff08;lib&#xff09;概念 总结 3.初识进程3.1 基本事实与引入3.2…