代码修改

Stash

这个命令用来储藏当前未提交的改动,我配置了两个别名:

  1. gst:用来储藏改动,是 git stash -u 的缩写,-u 参数表示未跟踪的文件(untracked) 也会被储藏。
  2. gsp :用来复原储藏,是 git stash pop --index 的缩写,--index 表示会试图还原此前的索引状态。比如原来改动了两个文件 ab,其中文件 a 已经被添加到暂存区(add)但 b 没有。普通的 git stash pop 会把 ab 都还原为未暂存状态。添加 --index 参数则会将 a 还原为暂存状态。

Reset

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

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

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

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

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

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

接下来,reset 命令会试图把暂存区也和指定的提交保持一致。因此重置完成后,暂存区和历史区保持一致,但工作区和暂存区会出现大量的不一致,所以 git status 命令会提示我们有很多文件需要暂存(add)。如果是用 reset --mixed 参数或者不加任何参数,重置就会到此为止。可见这个命令相当于撤销了 git addgit commit 操作。

最后,reset 命令还有一个参数是 --hard,它会试图把工作区也和指定的提交保持一致。这个命令是不安全的,如果工作区内的文件还没有提交,它就会丢失。提交过的文件可以用 git reflog 找回。重置结束后,三个区域内的文件都和指定的提交保持一致,git status 不会有任何输出。

总结一下,git reset 在重置版本时会做三件事:

  1. 让历史区与指定的提交保持一致,如果是 --soft参数则到此为止
  2. 让暂存区和历史区与指定的提交保持一致,如果不加参数或者是 --mixed 参数则到此为止
  3. 让工作区、暂存区和历史区都与指定的提交保持一致。如果是 --hard 参数就会走到这一步

注意,我们要记的是 reset 命令的本质,而不是它的外在表现。理解了它会做什么,就很容易预测这么做的结果

至于 reset 的另一个用法:重置文件,和上述规则类似,只是它不会改变历史区,自然也就不存在 --soft 参数,其他两个参数的用法和规则是完全一致的,只不过是对文件生效。

在实际使用中,我配置了这三个命令:

  1. grh:让工作区、暂存区和历史区都与指定的提交保持一致,可以理解为撤销所有改动,是命令 git reset --hard 的简写
  2. grm:让暂存区和历史区与指定的提交保持一致,可以理解为撤销 git add,是命令 git reset的缩写,通常我会用 grm file_name 来撤销对某个文件的暂存
  3. grs:让历史区与指定的提交保持一致,可以理解为撤销 git commit,是命令 git reset --soft 的缩写

Checkout

除了可以在分支和 tag 间进行切换外,如果 checkout 后面加上文件名,可以将尚未暂存的文件重置为初始状态。

因此,这个命令也可以理解为仅对工作区生效的 git reset --hard,这是一个不可挽回的操作,请谨慎执行。

results matching ""

    No results matching ""