news 2026/5/8 3:13:28

Git Reset命令介绍(用于移动HEAD,并选择是否同步更新暂存区工作区)三种模式:--soft、--mixed(默认)、--hard;修改最近提交、合并多个提交、取消git add、回退版本回退

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git Reset命令介绍(用于移动HEAD,并选择是否同步更新暂存区工作区)三种模式:--soft、--mixed(默认)、--hard;修改最近提交、合并多个提交、取消git add、回退版本回退

注意区分:git resetgit reset HEAD~1(功能完全不同,git reset只用于取消文件暂存)

命令移动HEAD重置暂存区保留工作目录更改主要用途
git reset❌ 不移动✅ 重置到HEAD✅ 保留取消文件暂存
git reset HEAD~1✅ 移动到前一个提交✅ 重置✅ 保留撤销最后一次提交,保留修改
git reset --mixed HEAD~1✅ 移动到前一个提交✅ 重置✅ 保留同上,与上者等价

文章目录

  • Git Reset 命令详解:撤销提交、回退代码与重置状态
  • 一、理解 Git 三大区域(核心前提)
    • 1. Working Directory(工作区)
    • 2. Staging Area(暂存区 / Index)
    • 3. Repository(本地仓库)
  • 二、git reset 的本质
  • 三、reset 的三种模式(最核心)
  • 四、git reset --soft
    • 作用
    • 示例
    • 等价理解
    • 常见用途
    • 1. 修改最近一次 commit
    • 2. 合并多个 commit
  • 五、git reset --mixed(默认)
    • 作用
    • 示例
    • 状态变化
    • 最常见用途
    • 1. 取消 git add
    • 2. 拆分一次提交
  • 六、git reset --hard
    • 作用
    • 示例
  • 七、hard reset 的危险性
    • 非常重要
    • 使用前建议
  • 八、reset 常见写法
  • 1. 回退一个 commit
  • 2. 回退两个 commit
  • 3. 回退到指定 commit
  • 4. 仅取消暂存
  • 5. 重置所有暂存
  • 九、HEAD~1 是什么意思?
    • 含义
  • 十、git reset 的典型场景
  • 场景 1:commit message 写错
  • 场景 2:提交了不该提交的文件(将指定文件从暂存区Staging Area中移除,但保留工作目录中的修改内容)
  • 场景 3:commit 太大,想拆分
  • 场景 4:彻底放弃本地修改
  • 场景 5:本地回退到远程版本
  • 十一、git reset 与 git revert 的区别
    • git reset
    • git revert
    • 对比
  • 十二、已经 push 后还能 reset 吗?
    • force强制推送
    • 注意:如果已经push了,再用reset,直接用push不加参数是百分之百拒绝的
    • 更安全方式
  • 十三、reset 后如何恢复?(reflog)
    • 示例
  • 十四、reset 的思维模型(非常重要)
  • 十五、实际开发建议
    • 推荐原则
      • 日常取消 add
      • 修改 commit
      • 已 push 的 commit
      • 慎用 hard
  • 十六、总结

Git Reset 命令详解:撤销提交、回退代码与重置状态

在 Git 的日常使用中,git reset是一个非常强大、也非常容易误用的命令。

很多开发者第一次接触它时,都会被它的行为搞混:

  • 为什么有时候只是取消暂存?
  • 为什么有时候会回退 commit?
  • 为什么有时候代码直接没了?
  • --soft--mixed--hard到底有什么区别?

这篇文章会系统讲清楚:

  • git reset的本质
  • 三种 reset 模式
  • reset 对 Git 三大区域的影响
  • 常见使用场景
  • git revert的区别
  • 如何避免误操作

一、理解 Git 三大区域(核心前提)

学习git reset前,必须先理解 Git 的三个区域。

1. Working Directory(工作区)

你实际编辑代码的目录。

例如:

vimapp.py

修改的内容先存在工作区。


2. Staging Area(暂存区 / Index)

通过:

gitadd

加入的内容。

它表示:

“下一次 commit 我要提交这些内容”


3. Repository(本地仓库)

通过:

gitcommit

真正保存的历史记录。


二、git reset 的本质

一句话理解:

git reset用于“移动 HEAD”,并选择是否同步更新暂存区和工作区。

也就是说:

gitreset

本质上是在:

HEAD -> 指向新的 commit

然后根据参数决定:

  • 是否修改暂存区
  • 是否修改工作区

三、reset 的三种模式(最核心)

Git reset 最重要的三个模式:

模式HEAD暂存区工作区
--soft
--mixed(默认)
--hard

这是整个 reset 的核心。

下面逐个解释。


四、git reset --soft

作用

只移动 HEAD。

不会修改:

  • 暂存区
  • 工作区

示例

当前:

A -> B -> C (HEAD)

执行:

gitreset--softHEAD~1

结果:

A -> B (HEAD)

commit C 被“取消”。

但是:

  • C 的代码还在
  • 并且仍然在暂存区

等价理解

相当于:

“撤销 commit,但保留提交内容”


常见用途

1. 修改最近一次 commit

例如:

(提交信息不小心写错了)

gitcommit-m"wrong message"

想改 commit message:

gitreset--softHEAD~1gitcommit-m"correct message"# 因为没有影响暂存区和工作去,可以直接改为正确提交信息再提交

2. 合并多个 commit

例如:

A -> B -> C -> D

想把:

C + D

合并:

gitreset--softHEAD~2gitcommit-m"combined changes"

五、git reset --mixed(默认)

这是默认模式。

即:

gitreset HEAD~1

等价于:

gitreset--mixedHEAD~1

作用

  • 移动 HEAD
  • 重置暂存区
  • 保留工作区

示例

执行:

gitreset--mixedHEAD~1

结果:

  • commit 被取消
  • 文件修改还在
  • 但不再处于 staged 状态

状态变化

之前:

已 commit

之后:

modified

需要重新:

gitaddgitcommit

最常见用途

1. 取消 git add

例如:

gitadd.

误加文件。

取消暂存:

gitreset

注:git reset相当于git reset HEAD,只重置暂存区(index)到HEAD状态,不会移动HEAD指针。主要用于取消文件的暂存状态(unstage files),比如把已经git add的文件移出暂存区不会回退任何提交。

或者:

gitreset file.txt

2. 拆分一次提交

比如:

你一次提交了很多文件:

gitcommit

想拆成多个 commit:

gitreset HEAD~1

然后重新:

gitaddfileAgitcommitgitaddfileBgitcommit

六、git reset --hard

这是最危险的模式。


作用

同时重置:

  • HEAD
  • 暂存区
  • 工作区

示例

执行:

gitreset--hardHEAD~1

结果:

  • commit 消失
  • staged 消失
  • 工作区修改也消失

相当于:

“彻底回到旧版本”


七、hard reset 的危险性

非常重要

gitreset--hard

可能导致:

未提交代码永久丢失

尤其:

gitreset--hardorigin/main

会直接覆盖本地修改。


使用前建议

先查看状态:

gitstatus

或者先备份:

gitstash

八、reset 常见写法

1. 回退一个 commit

gitreset HEAD~1

2. 回退两个 commit

gitreset HEAD~2

3. 回退到指定 commit

gitreset a1b2c3d

4. 仅取消暂存

gitreset file.txt

5. 重置所有暂存

gitreset

九、HEAD~1 是什么意思?

例如:

A -> B -> C -> D (HEAD)

含义

写法含义
HEAD当前 commit
HEAD~1上一个 commit
HEAD~2上上个 commit

十、git reset 的典型场景

场景 1:commit message 写错

gitreset--softHEAD~1gitcommit-m"new message"

场景 2:提交了不该提交的文件(将指定文件从暂存区Staging Area中移除,但保留工作目录中的修改内容)

gitreset HEAD file.txt

等价于:

gitreset file.txt

场景 3:commit 太大,想拆分

gitreset HEAD~1

重新 add。


场景 4:彻底放弃本地修改

gitreset--hard

场景 5:本地回退到远程版本

gitfetch origingitreset--hardorigin/main

十一、git reset 与 git revert 的区别

这是高频面试题。


git reset

本质:

修改历史

特点:

  • commit 消失
  • 会改变历史(指改变提交历史,以及“可能”改变工作区代码,如果用hard模式git reset --hard HEAD~1的话)
  • 不适合已经 push 的 commit

git revert

本质:

新建一个“反向 commit”

例如:

A -> B -> C

revert C 后:

A -> B -> C -> D

D 是“撤销 C”的 commit。


对比

对比项resetrevert
是否改历史
是否安全较危险更安全
是否适合已 push
是否删除 commit

十二、已经 push 后还能 reset 吗?

可以。

但危险。


force强制推送

gitreset--hardHEAD~1gitpush--force

会:

  • 改写远程历史
  • 影响团队成员

注意:如果已经push了,再用reset,直接用push不加参数是百分之百拒绝的

更安全方式

优先:

gitrevert

十三、reset 后如何恢复?(reflog)

很多人不知道:

Git 很少真正删除 commit。

可以通过:

gitreflog

查看历史 HEAD。


示例

gitreflog

输出:

a1b2c3 HEAD@{0}: reset: moving to HEAD~1 d4e5f6 HEAD@{1}: commit: add feature
操作reflog 索引时间顺序
commit: add featureHEAD@{1}
reset: moving...HEAD@{0}

(数字越大,时间越早)

恢复:

gitreset--hardd4e5f6

十四、reset 的思维模型(非常重要)

记住一句话:

reset = 移动 HEAD

然后:

模式是否同步暂存区是否同步工作区
soft
mixed
hard

十五、实际开发建议

推荐原则

日常取消 add

用:

gitreset

修改 commit

用:

gitreset--soft

已 push 的 commit

优先:

gitrevert

慎用 hard

尤其:

gitreset--hard

执行前一定确认。


十六、总结

git reset是 Git 中最核心、也最容易误操作的命令之一。

它真正的本质是:

移动 HEAD,并决定是否同步暂存区和工作区。

记住这张表即可理解 90% 的 reset:

模式HEAD暂存区工作区
soft
mixed
hard

开发中最常见的用途:

  • 撤销 commit
  • 取消暂存
  • 拆分 commit
  • 回退版本
  • 放弃修改

但同时:

git reset --hard也可能让代码永久丢失。

所以:

  • reset 前先git status
  • 重要修改先git stash
  • 已 push 历史优先git revert

这样才能安全、高效地使用 Git。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 3:11:43

GodotFirebase插件实战:为游戏快速集成云端用户认证与实时数据库

1. 项目概述与核心价值 如果你正在用Godot引擎开发游戏,并且希望为你的作品添加一些现代化的后端服务——比如让玩家可以注册登录、保存游戏进度到云端、或者上传下载游戏截图——那么你大概率绕不开Google Firebase。Firebase提供了一整套后端即服务(B…

作者头像 李华
网站建设 2026/5/8 3:10:44

本地AI对话搜索引擎aii:构建私有知识库与AI助手记忆体

1. 项目概述:打造你的本地AI对话记忆库如果你和我一样,每天都要和Claude Code、Cursor、Codex这些AI编程助手打交道,那么你一定遇到过这个场景:上周明明和AI助手一起解决了一个棘手的Webhook重试问题,但今天想回顾一下…

作者头像 李华
网站建设 2026/5/8 3:09:16

Java+wangEdit5导出可编辑pdf文件

1、问题概述? 生成的pdf是可编辑的文件,不是图片格式,该案例能实现原样输出。 使用wangEdit5作为在线编辑的工具,生成的内容会保存在数据库中。 在平时使用中,期望能将保存在数据库中的“html元素内容”导出生成pdf文件,方便传输。 本案例基于Java+Springboot2.7.16,…

作者头像 李华
网站建设 2026/5/8 3:04:30

构建本地AI知识库:基于前缀分类与语义去重的中文工作流实践

1. 项目概述:一个为中文AI工作流量身定制的知识沉淀引擎如果你和我一样,日常重度使用Cursor、Claude或者任何基于LLM的AI助手进行编程、写作或研究,那你一定遇到过这个痛点:和AI的对话里充满了闪光的想法、临时的解决方案和踩过的…

作者头像 李华
网站建设 2026/5/8 3:02:09

从游戏技能树到个人成长:构建结构化学习路径的实践指南

1. 项目概述:技能树的个人化实践 最近在GitHub上看到一个挺有意思的项目,叫 human-skill-tree 。初看这个名字,你可能会联想到游戏里的天赋树或者技能加点系统。没错,这个项目的核心灵感正是来源于此,但它并非用于游…

作者头像 李华