基於git管理來看,工做區,暫存區,版本倉庫實質上是管理的修改,暫存和提交的差別記錄。"不能說提交後暫存區就沒了",這比較容易引發誤差git
廖雪峯講的概念有誤指針
stage(暫存區) 並非 working directory(工做區)和 HEAD(版本庫) 之間的 臨時樞紐,不能按照 "內存"、"購物車" 來理解 stage,不然你會很難理解 git diff、git diff --staged日誌
stage 中擁有着 和 working directory 中如出一轍 的 目錄結構、文件內容code
當從版本庫或暫存區回退到工做區時,工做區新增的文件(也就是版本庫和暫存區沒有的文件)不會被刪除。,這點很重要。cdn
git add 其實是讓工做區的內容同步到暫存區blog
git commit 實際上就是把暫存區的內容同步到版本庫內存
git checkout <file_name> 其實就是讓暫存區同步到工做區get
git reset <commit> 其實就是讓版本倉庫的內容同步到暫存區同步
git reset --hard <commit> 實際上是讓版本倉庫的內容同步到暫存區和工做區,注意,這個時候工做區新增的文件不會被刪除it
git reset --soft HEAD~ 只是將版本倉庫的tree的指針指向HEAD的父節點,而不會改變暫存區和工做區
git reset --mixed HEAD~ 在版本庫回退上一版本的同時,讓版本庫內容同步到暫存區
git reset --hard HEAD^ 在版本庫回退上一版本的同時,讓版本庫內容同步到暫存區和工做區
git reset HEAD 實際上就是與git reset --mixed HEAD^相同
git reset file.txt
(這實際上是git reset --mixed HEAD file.txt
的簡寫形式)會讓file.txt
從HEAD複製到暫存區中。正好與git add
相反
git reset HEAD^ file.txt 會將HEAD^的file.txt覆蓋暫存區
git checkout-index -a 讓將暫存區的文件寫入工做區,注意:不會覆蓋工做區的文件,即只會寫入暫存區有而工做區沒有的文件
git checkout-index -a -f 讓工做區被暫存區文件所有覆蓋,注意:該方法不會刪除暫存區沒有而工做區有的文件
git checkout <branch>
會讓版本庫的指針指向<branch>分支的HEAD,同時讓工做區和暫存區同步到HEAD,注意:原來工做區的修改會被保留
git checkout -b <new_branch>
會建立分支並讓版本庫的指針指向該分支
git checkout [--detach] <commit>
能夠讓版本庫的HEAD指向<commit>,同時讓工做區和暫存區同步到HEAD,注意:原來工做區的修改會被保留
git checkout <file_name>
能夠讓暫存區的特定文件覆蓋工做區,(若是是想暫存區文件所有覆蓋工做區,能夠git checkout .
,注意:該方法不會刪除暫存區沒有工做區有的文件)
git diff 詳細顯示工做區和暫存區的差別
git diff HEAD --filename 比較工做區和版本庫的差別
git status 能夠顯示工做區和暫存區的差別與暫存區和版本庫的差別
git log 顯示版本庫提交日誌
表示還有未顯示的內容,能夠繼續按回車鍵查看,或者按q退出
參考: