In the first three forms, copy entries from <tree-ish>
to the
index. In the last form, set the current branch head (HEAD
) to
<commit>
, optionally modifying index and working tree to match.
The <tree-ish>
/<commit>
defaults to HEAD
in all forms.
git reset [-q] [<tree-ish>] [--] <pathspec>..., git reset [-q]
[--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
These forms reset the index entries for all paths that match
the <pathspec>
to their state at <tree-ish>
. (It does not
affect the working tree or the current branch.)
This means that git reset <pathspec>
is the opposite of git
add <pathspec>
. This command is equivalent to git restore
[--source=<tree-ish>] --staged <pathspec>...
.
After running git reset <pathspec>
to update the index entry,
you can use git-restore(1) to check the contents out of the
index to the working tree. Alternatively, using
git-restore(1) and specifying a commit with --source
, you can
copy the contents of a path out of a commit to the index and
to the working tree in one go.
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>...]
Interactively select hunks in the difference between the
index and <tree-ish>
(defaults to HEAD
). The chosen hunks are
applied in reverse to the index.
This means that git reset -p
is the opposite of git add -p
,
i.e. you can use it to selectively reset hunks. See the
'Interactive Mode' section of git-add(1) to learn how to
operate the --patch
mode.
git reset [<mode>] [<commit>]
This form resets the current branch head to <commit>
and
possibly updates the index (resetting it to the tree of
<commit>
) and the working tree depending on <mode>
. If <mode>
is omitted, defaults to --mixed
. The <mode>
must be one of
the following:
--soft
Does not touch the index file or the working tree at all
(but resets the head to <commit>
, just like all modes
do). This leaves all your changed files "Changes to be
committed", as git status
would put it.
--mixed
Resets the index but not the working tree (i.e., the
changed files are preserved but not marked for commit)
and reports what has not been updated. This is the
default action.
If -N
is specified, removed paths are marked as
intent-to-add (see git-add(1)).
--hard
Resets the index and working tree. Any changes to tracked
files in the working tree since <commit>
are discarded.
--merge
Resets the index and updates the files in the working
tree that are different between <commit>
and HEAD
, but
keeps those which are different between the index and
working tree (i.e. which have changes which have not been
added). If a file that is different between <commit>
and
the index has unstaged changes, reset is aborted.
In other words, --merge
does something like a git
read-tree -u -m <commit>
, but carries forward unmerged
index entries.
--keep
Resets index entries and updates files in the working
tree that are different between <commit>
and HEAD
. If a
file that is different between <commit>
and HEAD
has
local changes, reset is aborted.
--[no-]recurse-submodules
When the working tree is updated, using
--recurse-submodules will also recursively reset the
working tree of all active submodules according to the
commit recorded in the superproject, also setting the
submodules' HEAD to be detached at that commit.
See "Reset, restore and revert" in git(1) for the differences
between the three commands.