git reset and git checkout

git reset --hard <commit>:
1.替換引用的指向.引用指向新的提交ID;
2.替換暫存區.替換後,暫存區的內容和引用指向的目錄樹一致;
3.替換工作區.替換後,工作區的內容變得和暫存區一致,也和HEAD所指向的目錄樹內容相同.

git reset --soft <commit>:
1.替換引用的指向.引用指向新的提交ID.
即只更改引用的指向,不該編暫存區和工作區.

git reset --mixed <commit>或git reset <commit>:
1.替換引用的指向.引用指向新的提交ID;
2.替換暫存區.替換後,暫存區的內容和引用指向的目錄樹一致;
即更改引用的指向及重置暫存區,但是工作區不變.

實例:
git reset
僅用HEAD指向的目錄樹重置暫存區,工作區不受影響,相當於將之前用git add命令更新到暫存區的內容撤出暫存區.引用也未改變,因爲引用重置到HEAD相當於沒有重置.

git reset HEAD
同上

git reset -- filename
僅將文件filename的改動撤出暫存區,暫存區中其他文件不該變.相當於git add filename的反向操作.

git reset HEAD filename
同上

git reset --soft  HEAD^
工作區和暫存區不改變,但是引用向前回退一次.當對最新提交的提交說明或提交不滿意更改時,撤銷最新的提交一遍重新提交.

git reset HEAD^
工作區不變,但是暫存區會回退到上一次提交之前,引用也會回退一次.

git reset --mixed HEAD^
同上

git reset --hard HEAD^
徹底撤銷最近的提交.引用回退到前一次,而且工作區和暫存區都會回退到上一次提交的狀態.自上一次以來的提交全部丟失.

--------------------------------------------------------------------------------------------------------------------------------------

git  checkout 
git checkout <commit> [--] <paths>
1.<commit>是可選項,如果省略則相當於從暫存區進行檢出.和reset命令大不相同:重置的默認值是HEAD,而檢出的默認值是暫存區.
2.因此重置一般用於重置暫存區(除非使用--hard,否則不重置工作區),而檢出命令主要是覆蓋工作區(如果<commit>不省略,也會替換暫存區中相應的文件).
3.該命令不會改變HEAD的頭指針,主要用於指定版本文件覆蓋工作區中對應的文件.如果省略<commit>,則會用暫存區的文件覆蓋工作區的文件,否則用指定提交中的文件覆蓋暫存區和工作區中的對應文件.

git checkout <branch>
1.會改變HEAD頭指針.之所以後面的參數寫作<branch>,是因爲只有HEAD切換到一個分支纔可以對提交進行跟蹤,否則仍然會進入"分離頭指針"的狀態.在"分離頭指針"的狀態下的提交並不能被引用關聯到,從而可能丟失.所以該命令主要作用是切換分支.
2.如果省略<branch>則相當於對工作區進行狀態檢查.

實例:
git checkout branch
檢出branch分支,更新HEAD以指向branch分支,以及用branch指向的樹更新暫存區和工作區.

git checkout
彙總顯示工作區,暫存區與HEAD的差異

git checkout HEAD
同上

git checkout -- filename
用暫存區中的filename文件來覆蓋工作區中的filename文件.相當於取消自上次執行git add filename以來(如果執行過)的本地修改

git checkout branch -- filename
維持HEAD的指向不變.用branch所指向的提交中的filename替換暫存區和工作區中相應的文件.會將暫存區和工作區中的filename直接覆蓋

git checkout -- .或者git checkout .
會取消本地所有修改,相當於用暫存區的所有文件直接覆蓋本地文件.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章