Skip to content

Commit 84aed17

Browse files
jvnsgitster
authored andcommitted
doc: git-reset: clarify git reset [mode]
>From user feedback, there was some confusion about the differences between the modes, including: 1. Sometimes it says "index" and sometimes "index file". Fix by replacing "index file" with "index". 2. Many comments about not being able to understand what `--merge` does. Fix by mentioning `git merge --abort` since my best guess is that most folks want to use that instead of `git reset --merge`. 3. Issues telling the difference between --soft and --mixed, as well as --keep. Leave --keep alone because I couldn't understand its use case, but change `--soft` / `--mixed` / `--hard` as follows: --mixed is the default, so put it first. Describe --soft/--mixed/--hard with the following structure: * Start by saying what happens to the files in the working directory, because the thing users want to avoid most is irretrievably losing changes to their working directory files. * Then describe what happens to the staging area. Right now it seems to frame leaving the index alone as being a sort of neutral action. I think this is part of what's confusing users, because in Git when you update HEAD, Git almost always updates the index to match HEAD. So leaving the index unchanged while updating HEAD is actually quite unusual, and it deserves to be flagged. * Finally, give an example for --soft to explain a common use case. Signed-off-by: Julia Evans <julia@jvns.ca> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent c7049ed commit 84aed17

1 file changed

Lines changed: 22 additions & 20 deletions

File tree

Documentation/git-reset.adoc

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,42 +24,44 @@ However, when you specify files or directories or pass `--patch`,
2424
files without updating HEAD.
2525

2626
`git reset [<mode>] [<commit>]`::
27-
This form resets the current branch head to _<commit>_ and
28-
possibly updates the index (resetting it to the tree of _<commit>_) and
29-
the working tree depending on _<mode>_. Before the operation, `ORIG_HEAD`
30-
is set to the tip of the current branch. If _<mode>_ is omitted,
31-
defaults to `--mixed`. The _<mode>_ must be one of the following:
27+
Set the current branch head (`HEAD`) to point at _<commit>_.
28+
Depending on _<mode>_, also update the working directory and/or index
29+
to match the contents of _<commit>_.
30+
_<commit>_ defaults to `HEAD`.
31+
Before the operation, `ORIG_HEAD` is set to the tip of the current branch.
32+
+
33+
The _<mode>_ must be one of the following (default `--mixed`):
3234
+
33-
--
34-
`--soft`::
35-
Does not touch the index file or the working tree at all (but
36-
resets the head to _<commit>_, just like all modes do). This leaves
37-
all your changed files "Changes to be committed", as `git status`
38-
would put it.
3935

36+
--
4037
`--mixed`::
41-
Resets the index but not the working tree (i.e., the changed files
42-
are preserved but not marked for commit) and reports what has not
43-
been updated. This is the default action.
38+
Leaves your working directory unchanged.
39+
Updates the index to match the new HEAD, so nothing will be staged.
4440
+
4541
If `-N` is specified, removed paths are marked as intent-to-add (see
4642
linkgit:git-add[1]).
4743

44+
`--soft`::
45+
Leaves your working directory unchanged. The index is left unchanged,
46+
so everything in your current commit will be staged.
47+
For example, if you have no staged changes, you can use
48+
`git reset --soft HEAD~5; git commit`
49+
to combine the last 5 commits into 1 commit.
50+
4851
`--hard`::
49-
Resets the index and working tree. Any changes to tracked files in the
50-
working tree since _<commit>_ are discarded. Any untracked files or
51-
directories in the way of writing any tracked files are simply deleted.
52+
Overwrites all files and directories with the version from _<commit>_,
53+
and may overwrite untracked files.
54+
Updates the index to match the new HEAD, so nothing will be staged.
5255

5356
`--merge`::
57+
Mainly exists for backwards compatibility: `git merge --abort` is the
58+
usual way to abort a merge. See linkgit:git-merge[1] for the differences.
5459
Resets the index and updates the files in the working tree that are
5560
different between _<commit>_ and `HEAD`, but keeps those which are
5661
different between the index and working tree (i.e. which have changes
5762
which have not been added).
5863
If a file that is different between _<commit>_ and the index has
5964
unstaged changes, reset is aborted.
60-
+
61-
In other words, `--merge` does something like a `git read-tree -u -m <commit>`,
62-
but carries forward unmerged index entries.
6365

6466
`--keep`::
6567
Resets index entries and updates files in the working tree that are

0 commit comments

Comments
 (0)