git reset 基本用法整理

我们都知道 reset 有三种模式,很多文章上来就开始介绍这三种模式的异同,在我看来这不是一种很好用的模式。对于不是特别了解 Git 模型的读者来说,有必要介绍一些基础知识。

首先,在 Git 的思维中,它会管理三块不同的区域,工作区、暂存区和历史区。假设我们 clone
下来一个新的项目,此时三个区域内的文件内容是一模一样的。此时如果输入 git status 命令会没有任何输出。注意,这个命令并不会记录改动,而是时刻比较 工作区和暂存区 以及 暂存区和历史区 之间的差异,从而得出待暂存和待提交的文件列表。

当我们开始写代码时,文件发生了变动,这其实是更改了工作区中的代码,但暂存区和历史区是一致的,因此此时 git status 会显示有一些文件需要暂存,但不会提示有文件需要修改。使用
git add 命令后,它会把改动的文件和要提交的部分拷贝到暂存区中,此时工作区和暂存区是一致的,但暂存区和历史区的文件不一样,所以不会再显示有文件需要暂存,只会提示有文件要修改。输入 git commit 以后三个区域内的内容又保持一致了,因此 git status 不会再有任何输出。

在阅读 reset 的用法前,请务必确保你真的读懂了之前的两段话,否则请读到明白为止。

首先,reset 有两种用法,它的第一个参数是提交的 SHA-1,第二个参数如果不写则是整体重置,否则只重置单个文件,我们先介绍整体重置的情况。

此时,HEAD 指针一定会移动到指定的那次提交上,也就是说历史区会与指定的那次提交保持一致。如果是用 reset --soft 参数,那么重置就到此为止了。由于只有历史区被重置了,暂存区还没有发生变化,所以这个命令的作用相当于撤销了 commit,并且把他们都放入暂存区。

top Created with Sketch.