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
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")