用 Git 例子解释软重置
软重置会将 HEAD 指针移动到指定的提交。这不会重置暂存区或工作目录。
示例
该图显示了 Git 仓库中名为 *File1.txt* 的文件。A、B、C 和 D 代表添加到文件中的行。该图表明在添加每行 A、B 和 C 后都会执行提交。*c1* 是添加行 A 后执行的提交,*c2* 是添加行 B 后执行的提交,*c3* 代表添加行 C 后执行的提交。
现在添加行 D。此更改在工作目录中可用,此更改已暂存,但尚未提交。现在让我们执行软重置,使 master 分支的 HEAD 指向提交 *c1*。软重置后,HEAD 将指向提交 *c1*,而不会更改暂存区或工作区中的任何内容。

步骤 1 - 创建一个仓库并添加包含内容 A 的 File1.txt。提交更改,如下面的代码片段所示。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo $ git init Initialized empty Git repository in E:/tut_repo/.git/ $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo A>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git commit -m 'A' [master (root-commit) c2bd7e5] A 1 file changed, 1 insertion(+) create mode 100644 File1.txt
步骤 2 - 使用内容 B 和 C 执行另外 2 次提交,如上图所示。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo B>>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git commit -m 'B' [master 05cf92e] B 1 file changed, 1 insertion(+) $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo C>>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B C $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git commit -m 'C' [master 36361c2] C 1 file changed, 1 insertion(+) $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 36361c2 (HEAD -> master) C 05cf92e B c2bd7e5 A
步骤 3 - 在工作目录中进行更改以添加内容 D 并暂存更改。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ echo D>>File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B C D $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git add . $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git status -s M File1.txt
步骤 4 - 现在让我们执行软重置,使 HEAD 指向第一次提交。换句话说,我们必须将 HEAD 指针向后移动两次提交。但是,暂存区和工作目录不会进行任何更改。
$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline 36361c2 (HEAD -> master) C 05cf92e B c2bd7e5 A $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git reset --soft HEAD~2 $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git log --oneline c2bd7e5 (HEAD -> master) A $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ git status -s M File1.txt $ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master) $ cat File1.txt A B C D $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: File1.txt
如下图所示,当我们执行软重置时,Git 只会将 HEAD 移动到指定的提交,而不会影响工作区和暂存区。软重置后,我们的工作目录将包含文件中的所有四行。暂存的更改 **- 内容 D** 也将保留在暂存区中。

广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP