#### 重置命令的用法
用法一:git reset [-q] [<commit>] [--] <paths>... ? 為了避免路徑和引用(或提交ID)同名而發生沖突,可以在<paths>前用--作為分隔
用法二:git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
<commit>為可選項,可以使用引用或提交ID,若忽略<commit>則相當于使用了HEAD的指向作為提交ID
第一種用法不會重置引用,更不會改變工作區,而是用指定提交狀態(<commit>)下的文件(<paths>)替換掉暫存區中的文件;第二種用法則會重置引用,根據不同選項對暫存區或工作區進行重置。
動作1:替換引用的指向,引用指向新的提交ID
動作2:替換暫存區,替換后,暫存區的內容和引用指向的目錄樹一致
動作3:替換工作區,替換后,工作區的內容和暫存區一致,也和HEAD指向的目錄樹內容相同。
--soft執行1;--mixed執行1、2;--hard執行1、2、3
git reset 僅用HEAD指向的目錄樹重置暫存區,工作區不受影響,相當于將之前用git add命令更新到暫存區的內容撤出暫存區,引用也未改變,因為引用重置到HEAD相當于沒有重置。
git reset -- filename 僅將文件filenmae的改動撤出暫存區,暫存區中其他文件不該變,相當于git add filename的反向操作
#### 挽救錯誤的重置
通過.git/logs目錄下日志文件記錄了分支的變更,默認非裸版本庫(帶有工作區)都提供分支日志功能,因為core.logallrefupdates的值為true
Git提供了一個git config命令,對這個文件進行操作。使用show子命令可以顯示此文件的內容。查看git reflog的輸出和直接查看日志文件最大的不同在于顯示順序的不同,即最新改變放在了最前面顯示,而且只顯示每次改變的最終的SHA1哈希值。輸出還有一個方便的表達式:<refname>@{<n>},含義是引用<refname>之前第<n>次改變時的SHA1哈希值。
~~~
$ git reflog show master | head -5
~~~