工作區和暫存區
工作區(Working Directory)
就是你在電腦里能看到的目錄,比如我的learngit
文件夾就是一個工作區:
版本庫(Repository)
工作區有一個隱藏目錄.git
,這個不算工作區,而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master
,以及指向master
的一個指針叫HEAD
。
前面講了我們把文件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用git add
把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit
提交更改,實際上就是把暫存區的所有內容提交到當前分支。
所以,git add
命令實際上就是把要提交的所有修改放到暫存區(Stage),然后,執行git commit
就可以一次性把暫存區的所有修改提交到分支。
用git diff HEAD -- readme.txt
命令可以查看工作區和版本庫里面最新版本的區別。
tips:每次修改,如果不用git add
到暫存區,那就不會加入到commit
中。
撤銷修改
git checkout -- file
可以丟棄工作區的修改:
$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作區的修改全部撤銷,這里有兩種情況:
一種是readme.txt
自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt
已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。
總之,就是讓這個文件回到最近一次git commit
或git add
時的狀態。
tips:git checkout -- file
命令中的 --
很重要,沒有 --
,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到git checkout
命令。
如果已經git add
到暫存區了:
Git同樣告訴我們,用命令git reset HEAD <file>
可以把暫存區的修改撤銷掉(unstage),重新放回工作區:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD
時,表示最新的版本。
然后再用git checkout -- readme.txt命令丟棄工作區的修改。
1 $ git checkout -- readme.txt 2 3 $ git status 4 On branch master 5 nothing to commit, working tree clean
小結
又到了小結時間。
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>
,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。