Git reset到底该如何使用,一文读懂系列

git reset 是 Git 版本控制系统中的一个命令,用于将当前分支的 HEAD 移动到指定的提交(commit)上,并且可以选择性地修改工作目录和暂存区的状态。

具体而言,git reset 命令有三种主要模式:

  1. Soft Reset:

    • git reset --soft <commit> 会将 HEAD 移动到指定的提交,但不会修改工作目录和暂存区。这意味着之后你可以重新提交当前的更改,而这些更改将被包含在新的提交中。
  2. Mixed Reset:

    • git reset --mixed <commit> 是默认的模式,它将 HEAD 移动到指定的提交,并更新暂存区,但不会修改工作目录。这意味着你的工作目录将保留更改,但这些更改会被标记为未暂存状态,你可以选择性地暂存它们并提交。
  3. Hard Reset:

    • git reset --hard <commit> 是最彻底的模式,它将 HEAD 移动到指定的提交,同时也会修改工作目录和暂存区,使它们与指定的提交完全一致。这将导致未提交的更改被永久删除,请谨慎使用。

在所有这些模式中,<commit> 是目标提交的标识(通常是提交的哈希值或引用,如分支名)。使用 git reset 可以有效地重新定义项目的历史,但需要小心使用,尤其是在共享的仓库中,以免导致冲突和不一致。

为了便于理解,我在项目里创建了一个空文件,取名为第一版,提交之后,删了第一版,新建了第二版,再删除之后,新建了第三版。最后就是这样子的,只有第三版。

提交记录是这样子的。

Soft Reset

执行git reset --soft的命令,回到第一版的提交

bash 复制代码
git reset --soft 85804ef43f9e34a77665770b27fdad3ad10f0d75

执行之后,会变成这样

也就是说,当前工作区的内容并没有变,只是将在第一版之后修改的内容全部在缓存区,我们删除了第一版,新建了第三版,第二版的新建和删除相互抵消了。

Mixed Reset

倘若我们执行的是git reset --mixed

bash 复制代码
git reset --mixed 85804ef43f9e34a77665770b27fdad3ad10f0d75

执行之后是这样:

工作区其实还是一样的,是第三版,但是从Gui里看的话,是把第一版之后的所有修改都恢复到了工作区,可以继续修改这些内容然后一起提交,或者部分提交,比如我只提交删除第一版的操作,新建第三版的操作我们之后在提交。

Hard Reset

这个我认为是比较重量级的

我们执行git reset --hard的命令

bash 复制代码
git reset --hard 85804ef43f9e34a77665770b27fdad3ad10f0d75

执行完之后是这样的

代码回到了第一版提交了的时候,并且第一版之后的操作全部丢失了。

总结一下

  • Soft Reset常用作撤销最近的提交但保留更改,假设你做了一个提交,但是后来意识到有些更改不应该包含在这个提交中。你可以使用Soft Reset来撤销这个提交但保留更改

  • Mixed Reset 是把之后的所有修改恢复到了工作区,我们可以继续修改,再做提交。

  • Hard Reset 完完全全的穿越,会将代码恢复到某个版本。常用作bug在某个版本上的复现。 或者,之前有遇到小伙伴git使用不熟练导致自己本地代码合并的时候丢失的情况,可以使用这个命令恢复到合并之前。

这里git reset --hard有两个特殊的用法

  1. 撤销最近的提交并丢弃所有更改

假设你做了一个提交,但后来意识到这个提交是错误的,你希望完全撤销这个提交并丢弃所有的更改,包括暂存区和工作目录中的更改。你可以使用Hard Reset来实现这个目的:

bash 复制代码
git reset --hard HEAD~1

这将把 HEAD 指针移动到前一个提交,并彻底丢弃暂存区和工作目录中的所有更改。

  1. 将分支重置到远程仓库的状态

有时,你可能需要将本地分支完全重置为远程仓库的状态丢弃本地所有的提交和更改。这可以通过以下命令完成:

bash 复制代码
git fetch origin
git reset --hard origin/main

这将从远程仓库获取最新的提交,然后将本地分支重置到与远程分支完全一致的状态。

相关推荐
码兄科技4 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
腾讯云云开发5 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
后端
星栈5 小时前
从装一堆工具到看懂 Node 工程化思维:我的项目复盘记录
后端·node.js
65岁退休Coder6 小时前
LangChain v1.3.4 笔记 - 05 Agent 上下文记忆
后端
颜酱6 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端
JaneConan6 小时前
鸿蒙 韶非 UI 系列:能力调用 startAbilityForResult,跳能力拿回参,鸿蒙能力路由入门
后端·harmonyos
晴空了无痕6 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
用户8356290780516 小时前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python
花椒技术6 小时前
原本要 2 天的服务端冒烟前置审查,为什么 3 分半就能出报告?|QA 质量交付实践(三)
后端·ai编程·测试
达达尼昂6 小时前
AI 编程的工程化实践:Flutter AI Harness 的设计与落地
人工智能·后端·全栈