Home Explore Blog CI



git

1st chunk of `Documentation/git-reset.adoc`
b3dafb06711dd138cae0510d8f645e76fcdade2d03aa0a9d0000000100000fa6
git-reset(1)
============

NAME
----
git-reset - Reset current HEAD to the specified state

SYNOPSIS
--------
[synopsis]
git reset [-q] [<tree-ish>] [--] <pathspec>...
git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>...]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

DESCRIPTION
-----------
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 linkgit:git-restore[1] to check the contents out of the index to
the working tree. Alternatively, using linkgit: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 linkgit: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>_. Before the operation, `ORIG_HEAD`
	is set to the tip of the current branch. 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
linkgit:git-add[1]).

`--hard`::
	Resets the index and working tree. Any changes to tracked files in the
	working tree since _<commit>_ are discarded.  Any untracked files or
	directories in the way of writing any tracked files are simply deleted.

`--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`

Title: Git Reset Command
Summary
The git reset command is used to reset the current HEAD to a specified state, allowing users to undo changes, reset index entries, and update the working tree to match a specified commit, with various modes and options available for different use cases.