首頁 > 軟體

Git學習之旅 - 深入理解git reset 命令

2020-06-16 16:39:59

重置命令(git reset)是Git 最常用的命令之一,也是最危險最容易誤用的命令。來看看git reset命令用法。

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

用法一:git reset [-q]  [<commit>] [--] <paths》.....

用法二:git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

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

上面列出了兩個用法,其中<commit>都是可選項,可以使用參照或提交ID,如果省略<commit>則相當於使用了HEAD的指向作為提交ID.

上面列出的兩種祖墳的區別在於,第一種用法在命令中包含路徑<paths>.為了避免路徑和參照(或者提交ID)同名而發生衝突,可以在<paths>前用兩個連續的短線(減號)作為分隔。

第一種用法(包含了路徑<paths>的用法)不會重置參照,更不會改變工作區,而是用指定提交狀態(<commit>)下的檔案(<paths>)替換掉暫存區中的檔案。例如命令git reset HEAD <paths>相當於取消之前執行的git add <paths>命令時改變的暫存區。

第二種用法(不使用路徑<paths>的用法)則會重置參照。根據不同的選項,可以對暫存區或工作區進行重置。參照下面的版本庫模型圖,來看一看不同的引數對第二種重置語法的影響。

使用引數 --hard, 如:git reset --hard <commit>.

    會執行上圖中的全部動作1,2,3,即:

    1.替換參照的指向。參照指向新的提交ID. 

    2.替換暫存區。替換後,暫存區的內容和參照指向的目錄樹一致。

    3.替換工作區。替換後,工作區的內容變得和暫存區一致,也和HEAD所指向的目錄樹內容相同。

使用引數 --soft, 如:git reset --soft <commit>.

    會執行上圖中的操作1。即只更改參照的指向,不改變暫存區和工作區。

使用引數 --mixed或不使用引數(預設為 --mixed),如:git reset <commit>.

    會執行上圖中的操作1和操作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^

    徹底復原最近的提交。參照回退到前一次,而且工作區和暫存區都會回退到上一次提交的狀態。自行一次以來的提交全部丟失。


IT145.com E-mail:sddin#qq.com