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