git reset详解

一、git reset 的核心作用

用于 移动当前分支的 HEAD 指针 到指定的提交,并可选择是否修改工作区和暂存区。

⚠️ 注意:若提交已被推送到远程仓库,强制重置(--hard)后需谨慎操作,避免影响协作。


二、三种模式对比

模式 命令示例 影响范围 适用场景
--soft git reset --soft HEAD~1 仅移动 HEAD,保留修改在 暂存区 修改提交信息或合并提交
--mixed git reset HEAD~1 移动 HEAD,保留修改在 工作区 撤销提交但保留代码修改(默认模式)
--hard git reset --hard HEAD~1 移动 HEAD丢弃所有修改 彻底回退到历史版本(慎用!)

三、详细使用场景

1. 回退到指定提交
bash 复制代码
# 查看提交历史,获取目标 commit-hash
git log --oneline

# 回退到指定提交(默认 --mixed)
git reset abc1234
2. 撤销最近一次提交但保留代码
bash 复制代码
git reset HEAD~1          # 或 git reset --mixed HEAD~1
  • 修改会保留在工作目录,可重新编辑后提交。
3. 修改最后一次提交(不产生新提交)
bash 复制代码
git add <漏掉的文件>        # 添加遗漏的修改
git reset --soft HEAD~1   # 撤销提交但保留修改到暂存区
git commit -m "新描述"     # 重新提交
4. 彻底丢弃本地所有修改
bash 复制代码
git reset --hard HEAD     # 丢弃所有未提交的修改(包括工作区和暂存区)

四、关键参数详解

1. 指定回退步数
  • HEAD~1:回退 1 个提交

  • HEAD~3:回退 3 个提交

2. 回退到远程仓库状态
bash 复制代码
git reset --hard origin/main  # 强制与远程 main 分支一致
3. 回退单个文件
bash 复制代码
git reset HEAD~1 -- path/to/file  # 仅回退该文件到指定版本
git checkout HEAD~1 -- path/to/file  # 替代方案(保留提交历史)

五、与 git revert 的区别

命令 特点 适用场景
git reset 删除提交历史,改变 HEAD 本地未推送的提交回退
git revert 生成新提交来撤销旧提交 已推送提交的撤销

示例

  • 撤销已推送的提交:

    bash 复制代码
    git revert abc123  # 生成一个反向提交
    git push          # 安全推送

六、风险与注意事项

  1. --hard 会永久丢弃修改

    • 确保无需保留代码再使用,或提前 git stash 备份。
  2. 强制推送需团队协商

    bash 复制代码
    git reset --hard HEAD~3
    git push -f origin main  # 强制覆盖远程(谨慎!)

3.恢复误操作

  • 通过 git reflog 找回丢失的提交哈希

七、可视化示例

初始状态
bash 复制代码
A <- B <- C (HEAD -> main)
执行 git reset --soft B
bash 复制代码
A <- B (HEAD -> main)
# C 的修改保留在暂存区

执行 git reset --mixed B

bash 复制代码
A <- B (HEAD -> main)
# C 的修改保留在工作区

执行 git reset --hard B

bash 复制代码
A <- B (HEAD -> main)
# C 的修改被彻底丢弃

八、总结命令速查

需求 命令
撤销提交但保留代码 git reset HEAD~1
修改最后一次提交 git reset --soft HEAD~1
彻底回退到历史版本 git reset --hard abc123
撤销对单个文件的提交 git reset HEAD~1 -- file.txt
相关推荐
oscar9991 小时前
Monorepo 全面解析:优势、挑战与适用场景
git·monorepo
龙之叶3 小时前
Git Commit 生成与合入 Patch 指南
git
裸奔的大金毛11 小时前
Tekton - 自定义镜像配置git仓库克隆
git·ci/cd·devops·tekton
Adorable老犀牛14 小时前
可遇不可求的自动化运维工具 | 2 | 实施阶段一:基础准备
运维·git·vscode·python·node.js·自动化
xiaok15 小时前
把代码上传到gitee的时候,怎么忽略node_modules文件夹
git·gitlab·github
唐叔在学习15 小时前
听说有老哥分不清Git branch和tag?这不看看嘛
git·后端
雁于飞1 天前
vscode中使用git、githup的基操
笔记·git·vscode·学习·elasticsearch·gitee·github
小毛驴8502 天前
所有微服务部署都使用一个git地址,并且通过docker部署各个服务的情况下,如何编写mvn指令来处理各个服务。
git·docker·微服务
国王不在家2 天前
git 切换仓库后清理分支缓存
git
柯南二号2 天前
【Gitlab】Ubuntu 20.04服务器部署Gitlab
git·gitlab