Git reset

轉:https://blog.konghy.cn/2018/04/28/git-reset/

要理解 git reset 需要先了解其在版本管理中用到的三個重要概念,通常被稱爲三棵“樹”,“樹” 的實際意思是 “文件的集合”,而不是指特定的數據結構。這三棵樹即:

樹 含義
HEAD 上一次提交的快照,下一次提交的父結點
Index 預期的下一次提交的快照
Working Directory 工作目錄
HEAD 是當前分支引用的指針,它總是指向該分支上的最後一次提交。 這表示 HEAD 將是下一次提交的父結點。 通常,理解 HEAD 的最簡方式,就是將它看做 你的上一次提交 的快照。

Index 即索引,通常也被稱之爲暫存區,是 預期的下一次提交。 當運行 git add 時添加的內容都存儲在暫存區中。

工作目錄即包含 git 實際管理的文件的目錄,我們在該目錄下增、刪、改內容然後提交給 git 管理,所以稱之爲工作目錄。

Git 的工作流程主要就是通過操縱這三棵樹來以更加連續的狀態記錄項目的快照。

Git 三棵樹

git reset 命令使用格式:

git reset [--soft | --mixed [-N] | --hard] [-q] []
reset 命令以一種簡單可預見的方式直接操縱三棵樹,它做了三個基本操作:移動 HAED,重置索引,重置工作目錄。實際上 reset 是以特定的順序來重寫三棵樹,並在指定相應選項時停止:

1、移動 HEAD 分支的指向 (若指定了 --soft,則到此停止)
2、使索引看起來像 HEAD (若未指定 --hard,則到此停止)
3、使工作目錄看起來像索引
可見 reset 涉及到三個重要的參數 soft、 mixed、 hard, 無論指定那個參數,reset 都會移動 HEAD 的位置。其中 mixed 參數是默認行爲,也就是 git reset --mixed 與 git reset 等價。

可以這樣簡單的來理解着三個參數:

1、 git reset --soft 只移動 HEAD 到指定的 commit,但保留原先暫存區和工作目錄的內容,同時會將指定 commit 之後提交的內容設置到暫存區中
2、 git reset --mixed 移動 HEAD 到指定的 commit,同時重置暫存區爲指定 commit 的狀態(將內容從 HEAD 複製到暫存區中),但保留原先的工作目錄,同時將添加暫存區的修改撤銷到工作目錄中。該選項爲默認選項,可以省略
3、 git reset --hard 移動 HEAD,同時重置暫存區和工作目錄到指定 commit。也即是將三個樹都重置爲指定的 commit。
這三個參數中,只有 soft 和 mixed 是安全的,hard 會令工作丟失,使用時應該小心。

reset 命令還可以作用域路徑。若指定了一個路徑,reset 將會跳過第 1 步(移動 HEAD),並且將作用範圍限定爲指定的文件或文件集合。不過索引和工作目錄 可以部分更新,所以重置會繼續進行第 2、3 步。例如運行 git reset file.txt(這其實是 git reset --mixed HEAD file.txt 的簡寫形式,因爲既沒有指定一個提交的 SHA-1 或分支,也沒有指定 --soft 或 --hard),它會跳過移動 HEAD 的指向,但讓索引看起來像 HEAD(到此處停止)。

git reset --mixed 有 取消暫存文件 效果。實際上它與 git add 所做的操作相反,可以用該命令撤銷 add 到暫存區的修改到工作區。

git reset --soft 可以用於壓縮最近的提交,用該命令將 HEAD 移動到一箇舊一點的提交上(即你想要保留的第一個提交),然後然後再 commit 就可以將多個最近的提交壓縮爲一個(當然,該功能也可以用 git rebase -i 實現)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章