Understanding Git Reset and Revert

Understanding Git Reset and Revert

介绍git reset和revert的使用;通过git reset,撤销提交,回滚版本,使项目的进展更加顺利。
跳至正文

引言

项目开发中遇到过意外提交或糟糕的修改需要撤销的情况如何解决?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 命令的一般格式如下

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 会自动创建一个新的提交,撤销指定的更改,并保留撤销的历史记录。此时,你的代码将回到撤销的提交之前的状态。