git reset

文章目录

1.简介

git reset 将当前 HEAD 重置为指定状态,可用于版本回退。

可将分支重设(reset)到指定的<commit>,如果不显示指定 commit,默认是 HEAD,即最近一次提交。

比如我们 commit 后,可能发现这次 commit 的内容有错误,那么有两种处理方法:

(1)修改错误内容,再次 commit。

(2)使用 git reset 撤销这一次错误的 commit。

第一种方法比较直接,但会多一次 commit 记录,建议使用 git reset 进行版本回退,方便快捷,错误的 commit 记录不会被保留下来。

2.命令格式

shell 复制代码
git reset [-q] [<tree-ish>] [--] <paths>...​
git reset (--patch | -p) [<tree-ish>] [--] [<paths>...​]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

3.选项说明

复制代码
-q, --quiet
	静默模式,只打印错误信息。
--soft
	重置 HEAD,保留暂存区和工作区。版本库的修改会回退到暂存区,工作区的修改保持不动。
--mixed
	重置 HEAD 和暂存区,保留工作区。版本库与暂存区的修改都将回退到工作区,即回滚到了所有 git add 和 git commit 的执行之前的状态。为默认模式
--hard
	重置 HEAD、暂存区和工作区。暂存区和工作区的修改都将被丢弃。请谨慎使用,暂存区的修改很难找回,工作区的修改无法找回。
--merge
	重置 HEAD 和暂存区,保留工作区。与 --mixed 不同的是,暂存区的修改不会回退到工作。如果工作区的某个文件与暂存区不同,则命令执行失败。该选项很少使用
--keep
	重置 HEAD 与暂存区,保留工作区。与 --mixed 不同的是,暂存区的修改不会回退到工作。与 --merge 的区别是,如果工作区的某个文件与暂存区不同,则命令不会执行失败。该选项很少使用。
-p, --patch
	以 patch 的方式展示出来需要 reset 的代码, git reset -p 和 git add -p 就是一对互为反向的操作,后者是把工作目录下变更的代码以 patch 的方式展示出来,以互动的方式应用到 index 上,前者则是一个反向操作
-N, --intent-to-add
	任何新加入到 HEAD 的文件,再回退到工作区后都将标记为 tracked,即受版本控制

4.常用示例

(1)放弃当前版本的所有修改。

shell 复制代码
git reset --hard
git reset --hard HEAD

(2)分支版本跳转。

shell 复制代码
git reset --hard [commit]

commit 可取值 HEAD 当前版本,上一个版本 HEAD^(或 HEAD~1),上上个版本就是 HEAD^^(或 HEAD~2),以此类推。缺省为 HEAD。

(3)将暂存区的修改回退到工作区。

shell 复制代码
git reset <file>...
git reset HEAD <file>...
git reset --mixed <file>...
git reset --mixed HEAD <file>...

(4)将本地分支恢复至远端仓库的最新提交。

如果你已经使用 git reset --hard 回滚了本地代码,现在需要将分支恢复至远端仓库的最新提交,一般有两种方式:

方法一:硬重置(推荐)

直接将本地分支指向远端分支的最新提交(如 origin/main):

shell 复制代码
git reset --hard origin/main

效果:

本地 HEAD 和分支指针会与 origin/main 完全一致。

丢弃所有未提交的本地修改(包括未暂存的文件),确保与远端代码一致。

方法二:删除本地分支并重新检出

shell 复制代码
# 选项 -B 为强制模式:无论分支是否存在,均强制创建/重置分支。若分支已存在,会将其指向新的起点。
git checkout -B main origin/main

或分步操作:

shell 复制代码
git branch -D main         # 删除本地分支
git checkout main          # 重新检出(会自动匹配远端分支)

5.小结

git reset 主要用于 修改分支引用(HEAD),通过不同选项控制对 工作目录、暂存区 和 提交历史 的影响,实现以下操作:

  • 撤销提交(回退版本)
  • 取消暂存文件
  • 彻底丢弃本地更改

核心要点:

复制代码
--soft:只动 HEAD,保留暂存区和工作区,适合修整提交历史。
--mixed:动 HEAD 和暂存区,适合撤销 git add。
--hard:彻底回退,慎用!

口诀: --soft 改记录,--mixed 清暂存,--hard 全丢掉,远程提交别乱搞。


参考文献

Git - git-reset Documentation

相关推荐
_poplar_2 小时前
09 【C++ 初阶】C/C++内存管理
c语言·开发语言·数据结构·c++·git·算法·stl
AI视觉网奇2 小时前
rebase 和pull的通俗区别是什么
git·团队开发
XujiRe8 小时前
解决在IDEA、webstorm里Git特别慢的问题
git·intellij-idea·webstorm
test_sy10 小时前
git命令详解
git
少说多做34311 小时前
Git 基础操作笔记(速查)
笔记·git·学习
!逻辑非11 小时前
Git仓库的用法
git
wdfk_prog2 天前
实战教程:从“对象文件为空“到仓库重生——修复 Git 仓库损坏全记录
大数据·网络·笔记·git·学习·elasticsearch·全文检索
ALex_zry2 天前
Git Status 命令深度指南:洞悉仓库状态的核心艺术
大数据·git·elasticsearch
啃火龙果的兔子2 天前
如何在 VS Code 中进行 `cherry-pick`
git