Why explicitly call git reset --soft before git reset (--mixed)

后端 未结 1 621
無奈伤痛
無奈伤痛 2021-02-09 13:48

In the git docs (and numerous SO threads) this reset approach is recommended:

$ git reset --soft HEAD^ ;# go back to WIP state  <2>
$ git reset                     


        
1条回答
  •  难免孤独
    2021-02-09 14:35

    No, there doesn't seem to be any difference.
    It is more to illustrate the git reset --soft (i.e. moving HEAD only, which can have other more practical uses)

    git reset HEAD is for "unstaging", and a simple git reset HEAD^ does both (move the HEAD, and unstage, no need for --mixed, since it is the default option)


    Here is a quick test to see what that looks like:

    Before (you just switch back to feature, where you committed a "wip" -- work in progress):

    C:\Users\VonC\prog\git\test\r\r3>gl
    * 6ac95bd - (origin/master, origin/HEAD, master) fix in master (2 minutes ago) 
    | * fd8d97d - (HEAD, origin/feature, feature) snap WIP (3 minutes ago) 
    | * 16066dd - f1 (3 minutes ago) 
    |/
    * e8ad96f - f1 (3 minutes ago) 
    

    The reset itself:

    C:\Users\VonC\prog\git\test\r\r3>git reset "HEAD^"
    Unstaged changes after reset:
    M       f
    

    That gives you the status:

    C:\Users\VonC\prog\git\test\r\r3>git st
    # On branch feature
    # Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded.
    #   (use "git pull" to update your local branch)
    #
    # Changes not staged for commit:
    #   (use "git add ..." to update what will be committed)
    #   (use "git checkout -- ..." to discard changes in working directory)
    #
    #       modified:   f
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    

    log after git reset HEAD^

    C:\Users\VonC\prog\git\test\r\r3>gl
    * 6ac95bd - (origin/master, origin/HEAD, master) fix in master (6 minutes ago) 
    | * fd8d97d - (origin/feature) snap WIP (7 minutes ago) 
    | * 16066dd - (HEAD, feature) f1 (7 minutes ago) 
    |/
    * e8ad96f - f1 (8 minutes ago) 
    

    In two steps, you would have seen the following log after the git reset --soft HEAD^:

    C:\Users\VonC\prog\git\test\r\r2>gl
    * 6ac95bd - (origin/master, origin/HEAD, master) fix in master (65 seconds ago) 
    | * fd8d97d - (origin/feature) snap WIP (89 seconds ago) 
    | * 16066dd - (HEAD, feature) f1 (2 minutes ago) 
    |/
    * e8ad96f - f1 (2 minutes ago) 
    

    You index would still reflect what was staged for wip:

    C:\Users\VonC\prog\git\test\r\r2>git st
    # On branch feature
    # Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded.
    #   (use "git pull" to update your local branch)
    #
    # Changes to be committed:
    #   (use "git reset HEAD ..." to unstage)
    #
    #       modified:   f
    #
    

    The reset would then unstaged, bringing you back to the same stage than a git reset HEAD^ would have in one step:

    C:\Users\VonC\prog\git\test\r\r2>git reset
    Unstaged changes after reset:
    M       f
    
    C:\Users\VonC\prog\git\test\r\r2>git st
    # On branch feature
    # Your branch is behind 'origin/feature' by 1 commit, and can be fast-forwarded.
    #   (use "git pull" to update your local branch)
    #
    # Changes not staged for commit:
    #   (use "git add ..." to update what will be committed)
    #   (use "git checkout -- ..." to discard changes in working directory)
    #
    #       modified:   f
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    

    0 讨论(0)
提交回复
热议问题