Understanding Git Reset and Revert
引言
项目开发中遇到过意外提交或糟糕的修改需要撤销的情况如何解决?Git Reset 它可以帮助我们在 Git 历史中回到过去,去除错误的提交或修改,为项目的进展铺平道路
Git 核心概念:工作目录、暂存区与版本库 📦
在了解 Git Reset 之前,我们需要先理解 Git 的三个核心区域:┌─────────────────────────────────────────────────────────────┐│ Git 仓库 ││ ┌─────────────────────────────────────────────────────┐ ││ │ 版本库 (.git) │ ││ │ ┌─────────────┐ ┌─────────────────────────┐ │ ││ │ │ HEAD │ │ 对象区 │ │ ││ │ │ 指向当前 │ │ ┌─────────────────┐ │ │ ││ │ │ 分支 │ │ │ 暂存区 │ │ │ ││ │ └─────────────┘ │ │ (Index/Stage) │ │ │ ││ │ │ └─────────────────┘ │ │ ││ │ │ ┌─────────────────┐ │ │ ││ │ │ │ 对象数据库 │ │ │ ││ │ │ │ (Commit历史) │ │ │ ││ │ │ └─────────────────┘ │ │ ││ │ └─────────────────────────┘ │ ││ └─────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────┐ ││ │ 工作目录 │ ││ │ (Working Directory) │ ││ └─────────────────────────┘ │└─────────────────────────────────────────────────────────────┘
- 工作目录 (Working Directory): 你正在编辑的实际文件,是项目的当前状态
- 暂存区 (Staging Area/Index): 一个介于工作目录和版本库之间的区域,用于选择性地准备要提交的更改
- 版本库 (Repository): 存储所有提交历史和对象数据库的地方
Git 文件流转:
git add→ 将工作目录的更改添加到暂存区git commit→ 将暂存区的更改保存到版本库
理解这三个区域的概念,对于掌握 git reset 的三种模式至关重要。
reset 命令格式和参数 🛠️
在开始介绍 Git Reset 的使用案例之前,我们先来了解一下 Git Reset 命令的格式和参数。Git Reset 命令的一般格式如下git reset [option] <commit>
Git Reset 命令有三个主要的选项参数,它们分别是:
git reset --soft <commit>: 此命令将 HEAD 移动到指定的提交,但保留暂存区和工作目录不变。这意味着所有的更改仍然被暂存,你可以重新提交。这是撤销提交但保留更改以便重新提交的好方法。
只改变 HEAD 的位置,不改变暂存区和工作目录git reset --mixed <commit>: 这是 git reset 的默认模式。此命令将 HEAD 移动到指定的提交,并且也会更新暂存区以匹配这个提交。但是,工作目录中的文件不会改变。这意味着你的更改仍然存在,但没有被暂存,你可以重新暂存和提交。
只改变 HEAD 和暂存区的位置,不改变工作目录git reset --hard <commit>: 此命令将 HEAD 移动到指定的提交,并且也会更新暂存区和工作目录以匹配这个提交。这将永久删除自指定提交以来的所有更改。这是一个危险的命令,因为它会永久删除更改,所以在使用之前一定要确认你不需要这些更改。
改变 HEAD、暂存区和工作目录的位置git reset --merge/keep不常用,暂不做介绍
git reset 也可以操作文件,通过
git reset <file_name>撤销暂存区中相应的文件
应用场景
修复错误的提交 🐞
有时候,我们可能会在项目中不小心提交了一些错误的代码或文件,甚至可能是敏感信息。你可以使用 git reset 回到之前的提交,撤销这次错误,然后再次进行修改,确保密码等敏感信息不再提交到代码库中。
回滚到稳定版本 ⏪
另一个 Git Reset 的常见应用场景是回滚到项目的稳定版本。有时候,在进行新功能开发或进行一些实验性的修改时,我们可能会发现项目出现了一些难以解决的问题,导致项目无法正常工作。通过回到之前的稳定版本,你可以快速撤销引入问题的修改,并确保项目回到可用状态。
例如,你在开发一个网站时添加了一些新功能,但发现它们导致了严重的性能问题,你希望丢弃这些修改,回到一个已知稳定的版本。使用 Git Reset,你可以轻松地回到之前的提交,撤销这些修改,确保项目恢复正常运行。
Git Revert
git reset 可以撤销提交,但是会删除提交历史,如果想保留提交历史,可以使用 git revert
git revert <commit>,其中<commit>是你希望撤销的提交的哈希值或引用。Git 会自动创建一个新的提交,撤销指定的更改,并保留撤销的历史记录。此时,你的代码将回到撤销的提交之前的状态。
Understanding Git Reset and Revert

