在使用 Git 的過程中,我們肯定會碰到文件修改了,但是修改后的結果不是我們期望的,這個時候如果我們要撤回修改,下面就列舉幾種常見的撤銷修改
1、工作區修改了文件,但是未使用 git add 添加到暫存區
這種情況如果你想撤回工作區的修改,可以使用如下命令撤銷工作區的修改
git checkout -- file

2、工作區修改了文件,使用 git add 添加到了暫存區,然后工作區又做了修改
這種情況如果你想撤回工作區的修改,可以使用如下命令撤銷工作區的修改,但是不能撤銷暫存區的修改
git checkout -- file

3、工作區修改了文件,使用 git add 添加到了暫存區
這種情況如果你想撤回暫存區的修改,可以使用如下命令將提交到暫存區的內容撤銷回工作區
git reset HEAD file

4、工作區修改了文件,使用 git add 添加到了暫存區,並且使用了 git commit 提交到了分支上
這種情況如果你想撤回到你所希望的版本,可以使用如下命令
git reset --hard 提交版本號

5、總結:
首先需要知道工作區(working diretory)和暫存區(Stage)這兩個概念.工作區的概念不僅包含你實際更改的文件還應當包括當前修改但未 add 存入暫存區的文件變化信息,暫存區的作用則是臨時存儲文件的變化信息,在 git add file 操作之后,暫存區中將記錄 file 文件上的修改信息.暫存區的存在更細化了時間節點,要知道有重大改變的版本或者是在一次修改工作整體完成之后才使用 commit.而在這之間需要保存的修改,自然需要一個緩存區暫時存放,廖雪峰的 git 教程中在"撤銷修改"部分中,提到了幾種情景和相應的 git checkout 與 git reset 命令.通過我的思考,在這個更直接地分析這兩個命令的含義
git checkout -- file:撤銷對工作區修改,這個命令是以最新的存儲時間節點(add 和 commit)為參照,覆蓋工作區對應文件 file,這個命令改變的是工作區
git reset HEAD -- file:清空 add 命令向暫存區提交的關於 file 文件的修改(Ustage),這個命令僅改變暫存區,並不改變工作區,這意味着在無任何其他操作的情況下,工作區中的實際文件同該命令運行之前無任何改變(僅僅是將暫存區的狀態變成了工作區)
