## git reset HEAD 取消緩存已緩存的內容
`git reset`?可能是人類寫的最費解的命令了。 我用 Git 有些年頭了,甚至還寫了本書,但有的時候還是會搞不清它會做什么。 所以,我只說三個明確的,通常有用的調用。請你跟我一樣盡管用它 —— 因為它可以很有用。
在此例中,我們可以用它來將不小心緩存的東東取消緩存。假設你修改了兩個文件,想要將它們記錄到兩個不同的提交中去。 你應該緩存并提交一個,再緩存并提交另外一個。如果你不小心兩個都緩存了,那要如何才能_取消_緩存呢? 你可以用?`git reset HEAD -- file`。 技術上說,在這里你不需要使用?`--`?—— 它用來告訴 Git 這時你已經不再列選項,剩下的是文件路徑了。 不過養成使用它分隔選項與路徑的習慣很重要,即使在你可能并不需要的時候。
好,讓我們看看取消緩存是什么樣子的。這里我們有兩個最近提交之后又有所改動的文件。我們將兩個都緩存,并取消緩存其中一個。
~~~
$ git status -s
M README
M hello.rb
$ git add .
$ git status -s
M README
M hello.rb
$ git reset HEAD -- hello.rb
Unstaged changes after reset:
M hello.rb
$ git status -s
M README
M hello.rb
~~~
現在你執行?`git commit`?將只記錄?`README`?文件的改動,并不含現在并不在緩存中的?`hello.rb`。
如果你好奇,它實際的操作是將該文件在“索引”中的校驗和重置為最近一次提交中的值。?`git add`?會計算一個文件的校驗和,將它添加到“索引”中, 而?`git reset HEAD`?將它改寫回原先的,從而取消緩存操作。
如果你想直接執行?`git unstage`,你可以在 Git 中配置個別名。 執行?`git config --global alias.unstage "reset HEAD"`?即可。 一旦執行完它,你就可以直接用?`git unstage [file]`作為代替了。
如果你忘了取消緩存的命令,Git 的常規?`git status`?輸出的提示會很有幫助。 例如,在你有已緩存的文件時,如果你不帶?`-s`?執行?`git status`,它將告訴你怎樣取消緩存:
~~~
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: README
# modified: hello.rb
#
~~~
> **簡而言之**,執行?`git reset HEAD`?以取消之前?`git add`?添加,但不希望包含在下一提交快照中的緩存。