一步一步探索 git reset

一步一步探索 git reset

  • 为求简单, 本文只考虑初始状态 Git 仓库, 缓存区域 和 当前目录 相同的情况
  • 本文的源地址: https://github.com/liuyunbin/...
  • 在同一目录下, 有相关的测试脚本

本文使用的 Git 版本

$ git version
git version 2.30.1

探索如下

构建一个测试目录

$ rm -r test
$ mkdir -p test && cd test
$
$ git init
$
$ echo a > 1.txt
$ git add 1.txt
$ git commit -m "A"
$
$ echo b > 1.txt
$ git add 1.txt
$ git commit -m "B"
$
$ echo c > 1.txt
$ git add 1.txt
$ git commit -m "C"
$
$ echo d > 1.txt
$ git add 1.txt
$ git commit -m "D"

此时的提交记录是 A --> B --> C --> D, Git 仓库, 暂存区, 当前目录都是 D

如果执行 git reset --soft HEAD~2 会有以下行为

  1. 将 HEAD 指向 HEAD~2 (B)
  2. 此时, Git 仓库是 B, 暂存区 和 当前目录 是 D
  3. 此时, 查看 仓库状态如下
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged ..." to unstage)
    modified:   1.txt

如果执行 git reset --mixed HEAD~2 会有以下行为

  1. 将 HEAD 指向 HEAD~2 (B)
  2. 将暂存区域中 HEAD (B) 之后的数据移到当前目录
  3. 此时, Git 仓库 和 暂存区域 是 B, 当前目录 是 D
  4. 此时, 查看 仓库状态如下
$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
        modified:   1.txt

no changes added to commit (use "git add" and/or "git commit -a")

如果执行 git reset HEAD~2 会有以下行为

这个同 git reset --mixed HEAD~2

如果执行 git reset --hard HEAD~2 会有以下行为

  1. 将 HEAD 指向 HEAD~2 (B)
  2. 删除 暂存区域, 当前目录中 HEAD (B) 之后的数据
  3. 此时, Git 仓库, 暂存区域 和 当前目录 都是 B
  4. 此时, 查看 仓库状态如下
$ git status
On branch master
nothing to commit, working tree clean

如果执行 git reset HEAD~2 -- 1.txt 会有以下行为

  1. 将暂存区域中 HEAD 之后的数据移到当前目录
  2. 将 Git 仓库 HEAD~2 的 1.txt 加入暂存区
  3. 此时, Git 仓库 和 当前目录为 D, 暂存区域中的 1.txt 是 B
  4. 此时, 查看 仓库状态如下
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged ..." to unstage)
    modified:   1.txt

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
    modified:   1.txt

如果执行 git reset --mixed HEAD~2 -- 1.txt 会有以下行为

这个同 git reset --mixed HEAD~2, 该命令已过时

参考资源

你可能感兴趣的:(git)