IDEA中Git版本回退终极指南:Reset与Revert双方案详解

目录

  • 前言
  • 一、版本回退前置知识
  • 二、Reset方案:整体改写历史
    • 1、IDEA图形化操作(推荐)
      • 1.1、查看提交历史
      • 1.2、选择目标版本
      • 1.3、选择回退模式
        • 1.3.1、Soft(推荐)
        • 1.3.2、Mixed
        • 1.3.3、Hard(慎用)
        • 1.3.4、Keep
      • 1.4、强制推送远程仓库
    • 2、命令行操作
      • 2.1、查看提交记录
      • 2.2、执行回退
      • 2.3、强制同步远程
  • 三、Revert方案:部分撤销提交
    • 1、IDEA图形化操作
      • 1.1、撤销目标提交
      • 1.2、提交新版本
    • 2、命令行操作
  • 总结

前言

  作为开发者,代码版本回退是日常高频操作。IntelliJ IDEA集成了强大的Git工具链,但面对resetrevert两种核心回退方案,许多开发者仍存在选择困惑。本文将解析Reset与Revert两种方案的操作细节及避坑指南。

一、版本回退前置知识

在操作前需明确三个核心概念:工作区 vs 暂存区 vs 仓库

区域本质操作指令场景举例
工作区你正在编辑的代码文件直接修改文件在 UserService.java 中新增代码
暂存区已标记待提交的修改git add将 UserService.java 添加到提交队列
仓库已永久保存的历史版本git commit生成一个版本号为 a1b2c3d 的提交

二、Reset方案:整体改写历史

  通过移动HEAD指针直接回退到目标版本,会删除后续提交记录,适用于本地或需强制同步远程的场景。

1、IDEA图形化操作(推荐)

1.1、查看提交历史

  右键项目 → Git → Show History,或在Log标签页查看所有提交记录。

在这里插入图片描述

1.2、选择目标版本

  右键要回退的提交 → Reset Current Branch to Here(将当前分支重置到此处)。

在这里插入图片描述

1.3、选择回退模式

  单击如上将当前分支重置到此处就会弹窗如下。

在这里插入图片描述

解析每个选项前先看下当前项目在所有状态的文件

在这里插入图片描述

好,四种状态文件已经准备完成,开始展示

1.3.1、Soft(推荐)

  选择Soft回退后,仅移动HEAD指针,所有文件内容没变化。Test1变为修改状态,后续push远程版本回退后,可以选择第一次和第二次的修改内容是否再次提交到远程仓库。

在这里插入图片描述

1.3.2、Mixed

  选择Mixed回退后,所有文件内容没变化(与Soft一样),只是将暂存区Test3移除到工作区,这样看来Soft和Mixed的区别就是清空暂存区。

在这里插入图片描述

1.3.3、Hard(慎用)

  选择Hard回退后,文件内容被还原为第一次提交的状态(Test1第二三提交内容和Test3没提交的内容丢失了),然后暂存区的整个文件Test3丢失(没有像Soft和Mixed转移到工作区),总得来说就是所有本地修改都会丢失(当然不包括工作区Test4,因为还没被git管理)。

  此时还没有push到仓库(后面讲),可以更新代码将Test1第二三提交的内容找回,但是Test2添加的a和Test3的内容则找不回了(因为当时这些内容都在暂存区,然而Hard已经清空暂存区,丢弃了所有修改

在这里插入图片描述

1.3.4、Keep

  选择Keep回退后,回退版本的文件内容被还原为第一次提交的状态(Test1第二三提交内容没了),其他状态的文件内容没有变化(也就是本地修改内容没丢失),但是暂存区文件被移除到工作区

在这里插入图片描述

  这种方式如果回退版本的时候Test1有修改内容,那么回退的时候会弹窗让你选择Test1修改没提交的内容如何处理,类似于解决冲突。(麻烦不推荐)

在这里插入图片描述

总结

  • Soft 回退:当你只想撤回 commit,但不影响文件内容,适用于你希望修改提交内容或者重新提交时使用(推荐

  • Mixed 回退:当你想撤销提交并清理暂存区,但保留文件修改,适用于需要重新整理提交时使用(感觉没用,想保留文件修改可以使用Soft)

  • Hard 回退:当你完全不需要当前工作和暂存区的修改,并且想彻底恢复到某个提交时使用,慎用,因为无法恢复丢失的内容(保证本地所有修改内容都没用可以使用

  • Keep 回退:当你希望恢复到某个提交的版本,但又不丢失本地修改时使用(恢复版本的文件的本地内容需要手动选择要还是丢,麻烦不推荐)

1.4、强制推送远程仓库

  • 回退后本地仓库版本低于远程,需执行强制推送
  • 在强制推送远程仓库前,都可以通过更新代码恢复上面的版本回退

方式一(不推荐)

  git push --force 是强制推送命令,它会将本地分支的内容强行推送到远程仓库,覆盖远程分支的历史记录。使用此命令时,如果远程分支的提交历史与本地分支不同,推送操作仍会进行,并且不会进行任何检查,可能会丢失远程仓库中的更改。因此,这个命令需要小心使用,尤其在多人协作的情况下,可能会覆盖他人的更改。

git push --force
# 等同于 
git push -f

方式二(推荐)

  git push --force-with-lease--force 的更安全版本。它会先检查远程分支是否被其他人更新,若有变动则推送失败并提示,避免覆盖他人更改。该命令会自动推送当前分支到远程仓库对应的分支。

git push --force-with-lease   # 推荐,避免覆盖他人提交

2、命令行操作

2.1、查看提交记录

方式一

git log 

在这里插入图片描述

方式二

git log --oneline   # 获取目标commit_id(前7位即可)

在这里插入图片描述

方式三

idea中直接选择历史版本右击选择复制修订号

在这里插入图片描述

2.2、执行回退

三种不同的回退模式,上面已经详细介绍了

# 彻底回退(删除工作区+暂存区修改)
git reset --hard 62b47d9   # 回退到上一个提交(保留工作区修改)
git reset --soft HEAD\~1   # 回退到前2个版本(保留工作区,暂存区重置)
git reset --mixed HEAD^^   

2.3、强制同步远程

这里与IDEA图形化操作命令一样

git push --force-with-lease   # 推荐,避免覆盖他人提交git push -f origin master   # 强制覆盖远程分支

三、Revert方案:部分撤销提交

  生成新的提交记录逆向操作目标版本,保留完整历史链,适合团队协作或需审计的场景。

1、IDEA图形化操作

1.1、撤销目标提交

仅仅撤销本次提交历史的内容,如果此版本后面又添加了b,此次撤销就需要解决冲突了。

在这里插入图片描述

1.2、提交新版本

自动生成Revert "原提交信息"的新提交,需要推送至远程(相当于我们手动点进这个文件,把添加a的代码删除,然后提交推送)

在这里插入图片描述

2、命令行操作

# 撤销单个提交
git revert 62b47d9  
# 推送当前分支到远程仓库
git push origin 分支

总结

  Git版本回退有两种主要方案:Reset通过移动HEAD指针直接回退,适用于本地或强制同步远程,Revert通过生成新的提交逆向撤销,适合团队协作并保留历史记录;根据需求选择合适方式并谨慎操作。

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

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

相关文章

PHP并发请求优化:使用`curl_multi_select()`实现高效的多请求处理

PHP并发请求优化:使用curl_multi_select()实现高效的多请求处理 背景 最近在项目中遇到一个需求,需要从多个 1 级网站(超过 200 个)获取数据,并且是通过 POST 请求瞬间发送到这些网站上。开始时我直接使用了 curl_ex…

【leetcode hot 100 206】反转链表

解法一:(头插法)在遍历链表时,将当前节点的 next 指针改为指向前一个节点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…

【QT】-易错点笔记-2025-2-7

1,QList<phy_simulator*> pList;为空不能append()追加,要先new,再用 QList<phy_simulator> pList为空时,确实不能调用 append() 方法。原因很简单,QList 是一个类对象,在 C++ 中,指针本身并不代表它指向的对象。因此,当你有一个指向 QList<phy_simulato…

AI-Deepseek + PPT

01--Deepseek提问 首先去Deepseek问一个问题&#xff1a; Deepseek的回答&#xff1a; 在汽车CAN总线通信中&#xff0c;DBC文件里的信号处理&#xff08;如初始值、系数、偏移&#xff09;主要是为了 将原始二进制数据转换为实际物理值&#xff0c;确保不同电子控制单元&…

实验一:在Windows 10/11下配置和管理TCP/IP

目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境&#xff1a;每人一台计算机&a…

Java直通车系列14【Spring MVC】(深入学习 Controller 编写)

目录 基本概念 编写 Controller 的步骤和要点 1. 定义 Controller 类 2. 映射请求 3. 处理请求参数 4. 调用业务逻辑 5. 返回响应 场景示例 1. 简单的 Hello World 示例 2. 处理路径变量和请求参数 3. 处理表单提交 4. 处理 JSON 数据 5. 异常处理 基本概念 Cont…

EA - 开源工程的编译

文章目录 EA - 开源工程的编译概述笔记环境备注x86版本EABase_x86EAAssert_x86EAThread_x86修改 eathread_atomic_standalone_msvc.h原始修改后 EAStdC_x86EASTL_x86EAMain_x86EATest_x86备注备注END EA - 开源工程的编译 概述 EA开源了‘命令与征服’的游戏源码 尝试编译. 首…

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…

为解决局域网IP、DNS切换的Windows BAT脚本

一、背景 为解决公司普通人员需要切换IP、DNS的情况&#xff0c;于是搞了个windows下的bat脚本&#xff0c;可以对有线网络、无线网络进行切换设置。 脚本内容 echo off title 多网络接口IP切换工具:menu cls echo echo 请选择要配置的网络接口: echo echo 1. 有线网络&am…

uni_app实现下拉刷新

1. 在页面配置中启用下拉刷新 首先&#xff0c;你需要在页面的 pages.json 文件中启用下拉刷新功能。 {"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页","enablePull…

OpenCV计算摄影学(14)实现对比度保留去色(Contrast Preserving Decolorization)的函数decolor()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将彩色图像转换为灰度图像。它是数字印刷、风格化的黑白照片渲染&#xff0c;以及许多单通道图像处理应用中的基本工具。 cv::decolor 是 OpenCV…

Qt常用控件之 纵向列表QListWidget

纵向列表QListWidget QListWidget 是一个纵向列表控件。 QListWidget属性 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素的对齐方式。selectRectVisible被选中的元素矩形是否可见。s…

关于 QPalette设置按钮背景未显示出来 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

PostgreSQL 安装与使用

下载地址: EDB: Open-Source, Enterprise Postgres Database Management 安装图形化安装界面安装。安装完后将bin目录配置到系统环境变量 执行psql -h localhost -p 5432 -U postgres 密码在安装过程中设置的 ​ 0、修改密码 ALTER USER sonar WITH PASSWORD 123456; 1、新…

【基础3】快速排序

核心思路 快速排序是Java中Arrays.sort()的实现原理&#xff0c;采用分治策略&#xff0c;通过选择基准元素&#xff0c;将数组分为两个子数组&#xff0c;使得左边元素 ≤ 基准元素 ≤ 右边元素&#xff0c;然后递归排序子数组。 举个简单的例子&#xff0c;图书管理员需要按…

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求 0、界面预览00、简介1、编译安装1.1 编辑模块配置文件 2、使用2.1 拨号规则GET 请求POST 请求JSON 数据 2.2 Lua 脚本GET 请求POST 请求JSON 数据 3 、示例3.1 示例 1&#xff1a;提交 CDR 到第三方接口3.2 示例 2…

Linux 开发工具

linux中&#xff0c;常见的软件安装方式---下载 yum/apt.rpm安装包安装源码安装 yum 查看软件包 通过yumlist命令可以罗列出当前⼀共有哪些软件包.由于包的数⽬可能⾮常之多,这⾥我们需要使⽤ grep 命令只筛选出我们关注的包.例如: # Centos $ yum list | grep lrzsz lr…

Agent革命:Manus如何用工作流拆解掀起AI生产力革命

一、现象级产品的诞生背景 2025年3月6日&#xff0c;一款名为Manus的AI产品在技术圈引发地震式传播。其官方测试数据显示&#xff1a;在GAIA基准测试中&#xff0c;基础任务准确率达86.5%&#xff08;接近人类水平&#xff09;&#xff0c;中高级任务完成率突破57%。这标志着A…

Linux13-TCP\HTTP

一、TCP粘包问题 1.TCP在接受数据时,多包数据粘在一起 2.原因: 2.1TCP发送数据时,会根据缓冲区数据的情况进行重新组包 2.2TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数据缓存。 3.如何解决 3.1发指定大小字节 将要发数据,封装在结构体里 struct data { …

网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析

在网络安全日益重要的今天&#xff0c;各国纷纷出台相关政策法规&#xff0c;以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0&#xff0c;分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…