1. 程式人生 > >git reset soft,hard,mixed區別詳解

git reset soft,hard,mixed區別詳解

GIT reset命令,似乎讓人很迷惑,以至於誤解,誤用。但是事實上不應該如此難以理解,只要你理解到這個命令究竟在幹什麼。

首先我們來看幾個術語

HEAD
這是當前分支版本頂端的別名,也就是在當前分支你最近的一個提交,也就是本地倉庫,即你的commit記錄

Index
index也被稱為staging area,即add的記錄

Working Copy
working copy代表你正在工作的那個檔案

先執行git log檢視當前的記錄,這裡是我預先做了幾次commit

commit fd9b11185a41cf5cfe187be61dc43c06dd7b5420
Author:
shooke <xingjiehu@163.com> Date: Fri Feb 24 15:23:55 2017 +0800 3 commit 0aa75d4355211a8b1943d1c8d5b4904e18053bcf Author: shooke <xingjiehu@163.com> Date: Fri Feb 24 15:23:37 2017 +0800 2 commit 2bdd42d126d269688be33759f96e4015a85e720b Author: shooke <xingjiehu@163.com> Date: Fri Feb 24
15:23:04 2017 +0800 1

當前工作區是乾淨的,下面執行以下命令

1 –soft

[email protected]-pc:/var/www/gittest$ git status
位於分支 master
無檔案要提交,乾淨的工作區
[email protected]-pc:/var/www/gittest$ git reset --soft HEAD~1
[email protected]-pc:/var/www/gittest$ git log
commit 0aa75d4355211a8b1943d1c8d5b4904e18053bcf
Author: shooke <
[email protected]163.com> Date: Fri Feb 24 15:23:37 2017 +0800 2 commit 2bdd42d126d269688be33759f96e4015a85e720b Author: shooke <[email protected]163.com> Date: Fri Feb 24 15:23:04 2017 +0800 1 [email protected]-pc:/var/www/gittest$ git status 位於分支 master 要提交的變更: (使用 "git reset HEAD <檔案>..." 以取消暫存) 修改: a.txt

我們發現使用git reset –soft後我們的commit少了一條,a.txt是已經add過的狀態
也就是說–soft只是撤銷了commit。但是a.txt的內容是沒有改變的。我們用公式標示一下

HEAD != index = Working Copy
只撤銷了commit ,保留了index(add過)和工作區

–mixed

我們恢復到3條記錄的狀態,繼續看下面的操作

[email protected]:/var/www/gittest$ git reset --mixed HEAD~1
重置後取消暫存的變更:
M   a.txt
[email protected]:/var/www/gittest$ git log
commit 0aa75d4355211a8b1943d1c8d5b4904e18053bcf
Author: shooke <xingjiehu@163.com>
Date:   Fri Feb 24 15:23:37 2017 +0800

    2

commit 2bdd42d126d269688be33759f96e4015a85e720b
Author: shooke <xingjiehu@163.com>
Date:   Fri Feb 24 15:23:04 2017 +0800

    1
[email protected]:/var/www/gittest$ git status
位於分支 master
尚未暫存以備提交的變更:
  (使用 "git add <檔案>..." 更新要提交的內容)
  (使用 "git checkout -- <檔案>..." 丟棄工作區的改動)

    修改:     a.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

我們發現git提示我們需要add,也就是說暫存區發生了修改,但是a.txt 的內容沒有改變
我們再用公式標示一下

HEAD = index != Working Copy
撤銷了commit 、index,工作區不變

–hard

我們恢復到3條記錄的狀態,繼續看下面的操作

[email protected]-pc:/var/www/gittest$ git reset --hard HEAD~1
HEAD 現在位於 0aa75d4 2
[email protected]-pc:/var/www/gittest$ git log
commit 0aa75d4355211a8b1943d1c8d5b4904e18053bcf
Author: shooke <[email protected]163.com>
Date:   Fri Feb 24 15:23:37 2017 +0800

    2

commit 2bdd42d126d269688be33759f96e4015a85e720b
Author: shooke <[email protected]163.com>
Date:   Fri Feb 24 15:23:04 2017 +0800

    1
[email protected]-pc:/var/www/gittest$ git status
位於分支 master
無檔案要提交,乾淨的工作區

這一次沒有a.txt有修改。也就是說工作區的檔案與暫存去、本地倉庫是一致的。開啟a.txt發現裡面的內容變成了2,也就是說a.txt內容也跟著回退到了上次commit時的程式碼。用公式表示

HEAD = index = Working Copy
commit 、index和工作區檔案都回退改變