【Git】git的回退功能

Git 的回退功能非常强大,但因为有多个命令,初学者很容易混淆。我们来系统地梳理一下最核心的几个“回退”指令:git resetgit revertgit restore

我会按照使用场景安全级别来为你讲解。


核心区别:reset vs revert

这是最重要的区别,理解了它就理解了 Git 回退的精髓:

  • git reset (重置/回滚): 会修改提交历史。它像一台时间机器,直接把你的分支带回到过去某个点,后面的历史记录就“消失”了。

    • 适用场景:只在你自己的本地分支上使用。因为会修改历史,绝对不要在已经推送到远程的公共分支(如 main, develop)上使用!
    • 危险性:较高,尤其是 --hard 模式。
  • git revert (撤销/反转): 不会修改历史,而是创建一个新的提交来抵消掉某个旧的提交。它像是在账本上写一笔“负数”来冲销之前的错误记录,而不是撕掉那一页。

    • 适用场景安全,适用于任何分支,尤其是已经推送到远程的公共分支。这是团队协作中推荐的回退方式。
    • 危险性:低。

1. git reset:强大的本地时间机器

git reset 主要用来回退未推送的本地提交。它有三种模式,决定了它对你的工作区和暂存区的影响。

假设你的提交历史是 A -> B -> C,当前在 C (HEAD 指向 C)。现在你想回退到 B

git reset <commit-B-hash>
# 或者更常用的,回退到上一个版本
git reset HEAD~1 
三种模式:
  • --soft (温柔模式)

    • 命令: git reset --soft HEAD~1
    • 效果:
      1. 提交历史: 回退到 BC 的提交被撤销。
      2. 暂存区 (Staging Area): 保留 C 提交时的所有更改,这些更改会处于“已暂存”状态。
      3. 工作区 (Working Directory): 保留 C 提交时的所有代码,文件内容不变。
    • 一句话总结:撤销了提交,但保留了所有代码更改并放在暂存区,你可以马上重新提交。
    • 应用场景:“我刚才的提交信息写错了,或者漏了几个文件,想把它们合并成一个新提交。”
  • --mixed (默认模式)

    • 命令: git reset HEAD~1 (不加参数时默认就是 --mixed)
    • 效果:
      1. 提交历史: 回退到 B
      2. 暂存区: 清空C 提交时的更改被移出暂存区。
      3. 工作区: 保留 C 提交时的所有代码,文件内容不变。
    • 一句话总结:撤销了提交,也撤销了 git add,但代码还在。
    • 应用场景:“我刚才的提交不仅有问题,我还想重新检查一下到底哪些文件需要提交。”
  • --hard (硬核/危险模式)

    • 命令: git reset --hard HEAD~1
    • 效果:
      1. 提交历史: 回退到 B
      2. 暂存区: 清空
      3. 工作区: 代码被丢弃。你的文件会完全恢复到 B 提交时的状态。
    • 一句话总结:彻底抹除 C 提交的所有痕迹,包括代码更改。
    • ⚠️ 警告:这是一个破坏性操作!任何未提交的本地修改、以及 --hard 模式回退掉的提交内容,如果没有备份,就很难找回了。
    • 应用场景:“我最近的几次提交完全是垃圾,我想彻底扔掉它们,从头再来。”

2. git revert:安全的企业级“撤销”

当你发现一个已经推送到 main 分支的提交 C 引入了一个 Bug,你不能用 git reset,因为这会搞乱团队其他成员的历史。这时就该用 git revert

如何使用:

假设你要撤销提交 C (commit-C-hash) 的更改。

git revert <commit-C-hash>
  • 效果:

    1. Git 会创建一个新的提交 D
    2. D 提交的内容,刚好是 C 提交内容的反向操作。比如 C 中添加了一行代码,D 就会删除那一行。
    3. 你的提交历史会变成 A -> B -> C -> D
    4. Git 会自动打开编辑器让你填写这次撤销操作的提交信息。
  • 一句话总结:用一次新的、正确的提交,来“纠正”一次旧的、错误的提交。

  • 应用场景:“线上代码出 Bug 了,需要立刻回滚某个已经发布的提交,同时保持历史记录的清晰和团队协作的稳定。”


3. git restore & git checkout --:撤销工作区的修改

这两个命令主要用于处理尚未提交的更改。

git restore 是较新的命令,语法更清晰,推荐使用。

场景一:撤销对工作区文件的修改(还没 git add

你不小心改乱了一个文件,想把它恢复到上次提交时的样子。

# 新语法 (推荐)
git restore <file_name># 旧语法
git checkout -- <file_name>

效果file_name 在你工作区的修改会被丢弃,恢复成和暂存区/上次提交一样的版本。

场景二:把文件从暂存区撤销(已经 git add,但还没 git commit

你用 git add 把一个不想提交的文件加到了暂存区。

# 新语法 (推荐)
git restore --staged <file_name># 旧语法
git reset HEAD <file_name>

效果:文件会从暂存区移除,但工作区的修改内容仍然保留


如何选择:一个简单的决策流程

  1. 这次回退需要影响公共历史吗?(即,代码已 pushmain/develop

    • -> git revert (安全第一)
    • -> 继续看第 2 步。
  2. 你想撤销的是已经 commit 的提交吗?

    • -> git reset
      • 想保留代码并重新提交? -> reset --soft
      • 想保留代码但重新暂存? -> reset --mixed
      • 想彻底丢掉代码? -> reset --hard ⚠️
    • (只是工作区或暂存区的修改) -> 继续看第 3 步。
  3. 你想撤销的是 git add 操作吗?

    • -> git restore --staged <file>
    • (只是想丢弃文件的本地修改) -> git restore <file>

记住这个流程,你就能在各种场景下选择最合适、最安全的回退指令了。

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

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

相关文章

STM32新建工程

1、新建工程 Keil5中&#xff0c;新建Project&#xff0c;选择STM32Project文件夹&#xff0c;在此文件夹下新建一个文件夹“STM32工程模板”&#xff0c;然后给工程文件起名字“Project”选择器件型号 2、添加启动文件 新建start文件夹复制启动文件&#xff1a;固件库文件夹……

网络传输过程

https传输过程客户端发起HTTPS请求操作&#xff1a;用户在浏览器输入 https://www.example.com 技术细节&#xff1a; 客户端向服务器443端口发起TCP连接 发送Client Hello消息&#xff08;包含支持的TLS版本、加密套件、客户端随机数&#xff09; 安全意义&#xff1a;建立安全…

【LeetCode 3440. 重新安排会议得到最多空余时间 II】解析

目录LeetCode中国站原文原始题目题目描述示例1&#xff1a;示例2&#xff1a;示例3&#xff1a;示例4&#xff1a;讲解1. 新规则&#xff0c;新挑战2. 收益从何而来&#xff1f;两种可能性的诞生3. 我们的终极策略4. 当策略被压缩到极致第一次遍历&#xff1a;从左到右&#xf…

C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果

卸载C运行库可能导致常用软件瘫痪&#xff01;这些不起眼的组件为Photoshop、游戏等提供关键支持&#xff0c;多个版本共存是正常现象&#xff0c;随意清理会引发程序报错甚至闪退。一、前言&#xff1a;C不是“编程语言”那么简单很多用户在电脑中看到“Microsoft Visual C Re…

前端vue对接海康摄像头流程

1、拆包摄像头、插电源2、下载SADP&#xff08;设备网络搜索&#xff09;&#xff0c;连接设备&#xff0c;获取ip地址 下载地址&#xff1a;https://partners.hikvision.com/tools 找到自己的设备类型DS开头3、摄像头链接wifi、网线 登录设备预览配置网页-配置网络-可预览等 4…

org.casic.javafx.control.PaginationPicker用法

org.casic.javafx.control.PaginationPicker 是 CASIC&#xff08;或某位作者&#xff09;基于 JavaFX 自制的分页控件&#xff0c;功能比官方 Pagination 更完整&#xff0c;支持&#xff1a;首页 / 上一页 / 下一页 / 尾页按钮页码快速跳转每页条数自定义总数据量、当前页码、…

下载 | Win10 2021精简版,预装应用极少!(7月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)

⏩ 【资源A047】Win10 IoT LTSC 2021精简版 &#x1f536;Windows 10 IoT 企业版 LTSC 2021 正式版更新中。LTSC是长期服务渠道版本&#xff0c;网友俗称“老坛酸菜版”&#xff0c;相当于精简版Win10&#xff0c;精简了很多预装应用&#xff0c;同时更新频率也更低&#xff0c…

Web3:Foundry使用指南

Foundry目录1. 前言2. 什么是Foundry3. 安装与环境配置1. 安装工具2. 重新加载 .bashrc3. 检查环境变量 PATH4. 手动运行 foundryup4. Foundry的基本使用1.创建一个新的Foundry项目2. 编写智能合约3. 编译智能合约4. foundry.toml 主要作用5.部署智能合约5. Cli参考1. forge2. …

uniapp+unipush推送配置

APP推送记录 一、使用框架 Uniappunipush推送插件 二、需要提前准备的 1.准备自有证书 可以用这个网站—香蕉云编&#xff08;用于安卓 ios证书生成&#xff09;https://www.yunedit.com/update/androidzhengshu/list 安卓证书生成后&#xff0c;下载证书&#xff0c;除了原文…

CentOS系统哪些版本?分别适用于那些业务或网站类型?

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一款开源的企业级 Linux 操作系统&#xff0c;因其稳定性、安全性和长期支持周期&#xff0c;广泛应用于服务器环境。以下是 CentOS 的主要版本及其适用场景的详细介绍。1. CentOS 主要版本CentOS 的版本…

【前端】【Iconify图标库】【vben3】createIconifyIcon 实现图标组件的自动封装

&#x1f9e9; Vue 图标管理全攻略&#xff1a;Iconify createIconifyIcon 封装最佳实践 在前端项目中&#xff0c;图标无处不在。按钮需要图标&#xff0c;导航需要图标&#xff0c;提示信息也少不了图标。如何优雅、高效地使用图标&#xff0c;是每个中大型 Vue 项目不可回…

数据可视化全流程设计指南

一、需求定义阶段1. 明确核心目标回答关键问题&#xff1a;2. 确定数据特性import pandas as pd data pd.read_csv(your_data.csv) print(f""" 数据概览: - 维度: {data.shape[1]}列 {data.shape[0]}行 - 类型分布: {data.dtypes.value_counts()} - 缺失值: …

Llama系列:Llama1, Llama2,Llama3内容概述

前言 参考视频&#xff1a;大模型修炼之道(三): Llama系列讲解 Llama1&#xff0c;Llama2, Llama3_哔哩哔哩_bilibili 本博客是基于视频的学习笔记&#xff0c;以及相关知识点的扩充 Llama1 1. 动机 使用完全开源数据&#xff0c;性能媲美GPT3研究开源&#xff0c;禁止商用…

Docker 搭建本地Harbor私有镜像仓库

Docker 搭建本地Harbor私有镜像仓库 一、Harbor 核心价值与企业级特性解析 在容器化技术普及的背景下&#xff0c;镜像仓库作为容器生命周期的核心组件&#xff0c;其可靠性直接影响开发效率与生产稳定性。Docker 官方的 Registry 虽能实现基础镜像存储&#xff0c;但存在明显短…

AI 助力:如何批量提取 Word 表格字段并导出至 Excel

在日常办公中&#xff0c;我们经常需要处理大量的 Word 文档中的表格数据&#xff0c;如学生登记表、客户信息表、报名表等。然而这些表格往往格式各异、字段命名不统一&#xff08;如“姓名”“名字”“Name”&#xff09;&#xff0c;甚至含有合并单元格或多余空白行&#xf…

在 Azure Linux 上安装 RustFS

本文分享在 Azure Linux 上安装并使用对象存储 RustFS 的过程。 关于 RustFS RustFS 是一款用 Rust 语言编写的分布式存储系统&#xff0c;兼容 S3 协议&#xff0c;是 MinIO 的国产化平替。详情可以前往 RustFS 官网。目前&#xff0c;RustFS 支持二进制、Docker 安装方式&am…

实现在线预览pdf功能,后台下载PDF

<!-- PDF预览模态框 --><n-modalv-model:show"pdfModalVisible"title"投诉统计报告预览":closable"false":mask-closable"false"positive-click"closePdfModal"positive-text"关闭":width"900"…

华为VS格行VS中兴VS波导随身WIFI6怎么选?流量卡OR随身WIFI,长期使用到底谁更香?

在移动互联时代&#xff0c;流量焦虑成为现代人的通病。面对"办流量卡还是随身WiFi"的抉择&#xff0c;许多人陷入两难。本文从实际需求出发&#xff0c;用数据和场景帮你精准决策&#xff0c;尤其这五类人群建议直接选择正规随身WiFi。一、这五类人&#xff0c;随身…

AI网络搜索

作为AI应用程序开发人员在了解函数调用&#xff08;Function Calling&#xff09;特性调用本地函数时可能注意到列表型参数tools中每一个元素都携带有一个type值。而在大多数函数调用示例程序中&#xff0c;这个type值一直被设定为“function”&#xff0c;这意味着它还可能存在…

39.Sentinel微服务流量控制组件

雪崩问题 微服务调用链路中某个服务故障,引起整个链路中的所有微服务都不可用。 解决方案 1.超时处理:设置一个超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止的等待。(只能起到缓解作用,并不能从根本上解决问题) 2.舱壁模式:限定每个业务能使用的线程…