﻿---
title: Understanding Git Reset and Revert
date: 2024-05-05
excerpt: 介绍git reset和revert的使用；通过git reset，撤销提交，回滚版本，使项目的进展更加顺利。
tags:
  - Git
cover: https://assets.vluv.space/cover/ToolChain/GitRevert.webp
---

## 引言

项目开发中遇到过意外提交或糟糕的修改需要撤销的情况如何解决？Git Reset 它可以帮助我们在 Git 历史中回到过去，去除错误的提交或修改，为项目的进展铺平道路

## Git 核心概念：工作目录、暂存区与版本库 📦

在了解 Git Reset 之前，我们需要先理解 Git 的三个核心区域：

```
┌─────────────────────────────────────────────────────────────┐
│                        Git 仓库                             │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                    版本库 (.git)                    │    │
│  │  ┌─────────────┐    ┌─────────────────────────┐     │    │
│  │  │   HEAD      │    │       对象区            │     │    │
│  │  │  指向当前   │    │  ┌─────────────────┐    │     │    │
│  │  │   分支      │    │  │   暂存区        │    │     │    │
│  │  └─────────────┘    │  │  (Index/Stage)  │    │     │    │
│  │                     │  └─────────────────┘    │     │    │
│  │                     │  ┌─────────────────┐    │     │    │
│  │                     │  │   对象数据库    │    │     │    │
│  │                     │  │  (Commit历史)   │    │     │    │
│  │                     │  └─────────────────┘    │     │    │
│  │                     └─────────────────────────┘     │    │
│  └─────────────────────────────────────────────────────┘    │
│                           │                                 │
│                           ▼                                 │
│              ┌─────────────────────────┐                    │
│              │      工作目录           │                    │
│              │   (Working Directory)   │                    │
│              └─────────────────────────┘                    │
└─────────────────────────────────────────────────────────────┘
```

- **工作目录 (Working Directory)**: 你正在编辑的实际文件，是项目的当前状态
- **暂存区 (Staging Area/Index)**: 一个介于工作目录和版本库之间的区域，用于选择性地准备要提交的更改
- **版本库 (Repository)**: 存储所有提交历史和对象数据库的地方

**Git 文件流转**：
1. `git add` → 将工作目录的更改添加到暂存区
2. `git commit` → 将暂存区的更改保存到版本库

理解这三个区域的概念，对于掌握 `git reset` 的三种模式至关重要。

## reset 命令格式和参数 🛠️

在开始介绍 Git Reset 的使用案例之前，我们先来了解一下 Git Reset 命令的格式和参数。Git Reset 命令的一般格式如下

```shell
git reset [option] <commit>
```

Git Reset 命令有三个主要的选项参数，它们分别是：

- `{shell} git reset --soft <commit>`: 此命令将 HEAD 移动到指定的提交，但保留暂存区和工作目录不变。这意味着所有的更改仍然被暂存，你可以重新提交。这是撤销提交但保留更改以便重新提交的好方法。
  只改变 HEAD 的位置，不改变暂存区和工作目录
- `{shell} git reset --mixed <commit>`: 这是 git reset 的默认模式。此命令将 HEAD 移动到指定的提交，并且也会更新暂存区以匹配这个提交。但是，工作目录中的文件不会改变。这意味着你的更改仍然存在，但没有被暂存，你可以重新暂存和提交。
  只改变 HEAD 和暂存区的位置，不改变工作目录
- `{shell} git reset --hard <commit>`: 此命令将 HEAD 移动到指定的提交，并且也会更新暂存区和工作目录以匹配这个提交。这将永久删除自指定提交以来的所有更改。这是一个危险的命令，因为它会永久删除更改，所以在使用之前一定要确认你不需要这些更改。
  改变 HEAD、暂存区和工作目录的位置
- `{shell} 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 会自动创建一个新的提交，撤销指定的更改，并保留撤销的历史记录。此时，你的代码将回到撤销的提交之前的状态。
