git reset揭秘


一、命令

首先,讓我們來解釋幾個定義.
 
HEAD(頭)
    指向當前branch最頂端的一個commit,該分支上一次commit后的節點
 
Index(索引)
    The index, 也可以被認為是staging area(暫存區), 是一堆將在下一次commit中提交的文件,提交之后它就是 HEAD的父節點. (譯注:git add添加的文件)
 
Working Copy(工作副本
    當前工作目錄下的文件,(譯注:一般指,有修改,沒有 git add,沒有 git commit的文件)
 
Flow(流程如下)
    當你第一次checkout一個新的分支,HEAD指向該分支上最近一次commit。它和index和working copy是一樣一樣的。
 
    當你修改了一個文件,Git注意到了會說“哦,有些東西被改了”,你的working copy不再和index和HEAD相同了,所以當文件有改動,它會標記這些文件。
 
    然后,你執行 git add命令,這條命令會將上面修改的文件緩存在index中,Git又說了“哦,你的working copy和index相同了,而他們倆和HEAD不同了”。
 
    當你執行 git commit,Git創建了一個新的commit,HEAD這時指向這個新的commit,此時,HEAD & index & working copy又相同了,Git又開心了一次。

二、命令

  git reset 命令是git中最常用的命令,但也是最危險,最容易被誤用的命令。reset命令本身很簡單,但是它的參數讓人迷惑,主要的參數有soft, hard and mixed,它們告訴Git,當執行reset時,要對index和working copy做什么。
 
Soft
    The --soft參數只告訴Git將其他的commit重置到HEAD,就僅此而已。index和working copy中的文件都不改變。
實例:
    git reset --soft 回退到某個版本,只回退了commit的信息,不會恢復到index file一級(即git add一級)。如果還要提交,直接commit即可
 
Mixed (default)
    The --mixed 改變HEAD和index,指向那個你要reset到的commit上。而working copy文件不被改變。當然會顯示工作目錄下有修改,但沒有緩存到index中。
實例:
    git reset --mixed 此為默認方式,不帶任何參數的git reset,即時這種方式,它回退到某個版本,只保留源碼,回退commit和index信息
 
Hard
    The --hard HEAD & index & working copy同時改變到你要reset到的那個commit上。這個參數很危險,執行了它,你的本地修改可能就丟失了。
實例: 
    git reset --mixed:徹底回退到某個版本,本地的源碼也會變為上一個版本的內容,此命令 慎用!
 
    命令后面就跟的是我們需要reset的位置,比如  origin/develop 、 origin/master 當然也可以使上幾次commit的id。
id的話我們可以通過git log查看

三、揭秘

     之前我們看到了reset后master文件的內容發生了變化,其實這就是reset命令的本質,但結合不同的參數,會有額外的工作:如--hard --soft --mixed等,他們決定了是否重置暫存區或工作區。
我們來看下面圖片
    其實reset命令有兩種用法:
    git reset [-q] [commit] [--] <paths>
 
    git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
 
    第一種用法是不會重置引用的,即不會修改master文件。只是用某一次提交的文件提交暫存區的文件
 
    第二種用法不使用<paths> 則會重置引用,並且參數不同決定是否覆蓋暫存區和工作區:
 
    --hard參數會執行途中1,2,3 全部動作,即暫存區,工作區全部用指定提交版本的目錄樹替換掉
 
    --soft 參數只執行1, 不進行暫存區和工作區的覆蓋
 
    --mixed或不使用參數,執行1,2覆蓋暫存區,但不覆蓋工作區
好了git reset 命令就說到這里吧,還有更多的git命令詳解等有時間了再總結放出來。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM