'\" t
.\" Title: git-reset
.\" Author: [see the "Author" section]
.\" Generator: DocBook XSL Stylesheets v1.75.2
.\" Date: 05/09/2012
.\" Manual: Git Manual
.\" Source: Git 1.5.5.5
.\" Language: English
.\"
.TH "GIT\-RESET" "1" "05/09/2012" "Git 1\&.5\&.5\&.5" "Git Manual"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
git-reset \- Reset current HEAD to the specified state
.SH "SYNOPSIS"
.sp
.nf
\fIgit reset\fR [\-\-mixed | \-\-soft | \-\-hard] [\-q] []
\fIgit reset\fR [\-q] [] [\-\-] \&...
.fi
.SH "DESCRIPTION"
Sets the current head to the specified commit and optionally resets the index and working tree to match\&.
This command is useful if you notice some small error in a recent commit (or set of commits) and want to redo that part without showing the undo in the history\&.
If you want to undo a commit other than the latest on a branch, linkgit:git\-revert[1] is your friend\&.
The second form with \fIpaths\fR is used to revert selected paths in the index from a given commit, without moving HEAD\&.
.SH "OPTIONS"
.PP
\-\-mixed
.RS 4
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\&.
.RE
.PP
\-\-soft
.RS 4
Does not touch the index file nor the working tree at all, but requires them to be in a good order\&. This leaves all your changed files "Changes to be committed", as linkgit:git\-status[1] would put it\&.
.RE
.PP
\-\-hard
.RS 4
Matches the working tree and index to that of the tree being switched to\&. Any changes to tracked files in the working tree since are lost\&.
.RE
.PP
\-q
.RS 4
Be quiet, only report errors\&.
.RE
.PP
.RS 4
Commit to make the current HEAD\&. If not given defaults to HEAD\&.
.RE
.SH "EXAMPLES"
.PP
Undo a commit and redo
.RS 4
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ git commit \&.\&.\&.
$ git reset \-\-soft HEAD^ \fB(1)\fR
$ edit \fB(2)\fR
$ git commit \-a \-c ORIG_HEAD \fB(3)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRThis is most often done when you remembered what you just committed is incomplete, or you misspelled your commit message, or both\&. Leaves working tree as it was before "reset"\&.
.br
\fB2. \fRMake corrections to working tree files\&.
.br
\fB3. \fR"reset" copies the old head to \&.git/ORIG_HEAD; redo the commit by starting with its log message\&. If you do not need to edit the message further, you can give \-C option instead\&.
See also the \-\-amend option to linkgit:git\-commit[1]\&.
.br
.RE
.PP
Undo commits permanently
.RS 4
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ git commit \&.\&.\&.
$ git reset \-\-hard HEAD~3 \fB(1)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRThe last three commits (HEAD, HEAD^, and HEAD~2) were bad and you do not want to ever see them again\&. Do \fBnot\fR do this if you have already given these commits to somebody else\&.
.br
.RE
.PP
Undo a commit, making it a topic branch
.RS 4
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ git branch topic/wip \fB(1)\fR
$ git reset \-\-hard HEAD~3 \fB(2)\fR
$ git checkout topic/wip \fB(3)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRYou have made some commits, but realize they were premature to be in the "master" branch\&. You want to continue polishing them in a topic branch, so create "topic/wip" branch off of the current HEAD\&.
.br
\fB2. \fRRewind the master branch to get rid of those three commits\&.
.br
\fB3. \fRSwitch to "topic/wip" branch and keep working\&.
.br
.RE
.PP
Undo add
.RS 4
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ edit \fB(1)\fR
$ git add frotz\&.c filfre\&.c
$ mailx \fB(2)\fR
$ git reset \fB(3)\fR
$ git pull git://info\&.example\&.com/ nitfol \fB(4)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRYou are happily working on something, and find the changes in these files are in good order\&. You do not want to see them when you run "git diff", because you plan to work on other files and changes with these files are distracting\&.
.br
\fB2. \fRSomebody asks you to pull, and the changes sounds worthy of merging\&.
.br
\fB3. \fRHowever, you already dirtied the index (i\&.e\&. your index does not match the HEAD commit)\&. But you know the pull you are going to make does not affect frotz\&.c nor filfre\&.c, so you revert the index changes for these two files\&. Your changes in working tree remain there\&.
.br
\fB4. \fRThen you can pull and merge, leaving frotz\&.c and filfre\&.c changes still in the working tree\&.
.br
.RE
.PP
Undo a merge or pull
.RS 4
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ git pull \fB(1)\fR
Auto\-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed/prevented; fix up by hand
$ git reset \-\-hard \fB(2)\fR
$ git pull \&. topic/branch \fB(3)\fR
Updating from 41223\&.\&.\&. to 13134\&.\&.\&.
Fast forward
$ git reset \-\-hard ORIG_HEAD \fB(4)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRTry to update from the upstream resulted in a lot of conflicts; you were not ready to spend a lot of time merging right now, so you decide to do that later\&.
.br
\fB2. \fR"pull" has not made merge commit, so "git reset \-\-hard" which is a synonym for "git reset \-\-hard HEAD" clears the mess from the index file and the working tree\&.
.br
\fB3. \fRMerge a topic branch into the current branch, which resulted in a fast forward\&.
.br
\fB4. \fRBut you decided that the topic branch is not ready for public consumption yet\&. "pull" or "merge" always leaves the original tip of the current branch in ORIG_HEAD, so resetting hard to it brings your index file and the working tree back to that state, and resets the tip of the branch to that commit\&.
.br
.RE
.PP
Interrupted workflow
.RS 4
Suppose you are interrupted by an urgent fix request while you are in the middle of a large change\&. The files in your working tree are not in any shape to be committed yet, but you need to get to the other branch for a quick bugfix\&.
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ git checkout feature ;# you were working in "feature" branch and
$ work work work ;# got interrupted
$ git commit \-a \-m "snapshot WIP" \fB(1)\fR
$ git checkout master
$ fix fix fix
$ git commit ;# commit with real log
$ git checkout feature
$ git reset \-\-soft HEAD^ ;# go back to WIP state \fB(2)\fR
$ git reset \fB(3)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRThis commit will get blown away so a throw\-away log message is OK\&.
.br
\fB2. \fRThis removes the \fIWIP\fR commit from the commit history, and sets your working tree to the state just before you made that snapshot\&.
.br
\fB3. \fRAt this point the index file still has all the WIP changes you committed as \fIsnapshot WIP\fR\&. This updates the index to show your WIP files as uncommitted\&.
.br
.RE
.PP
Reset a single file in the index
.RS 4
Suppose you have added a file to your index, but later decide you do not want to add it to your commit\&. You can remove the file from the index while keeping your changes with git reset\&.
.sp
.if n \{\
.RS 4
.\}
.nf
\&.ft C
$ git reset \-\- frotz\&.c \fB(1)\fR
$ git commit \-m "Commit files in index" \fB(2)\fR
$ git add frotz\&.c \fB(3)\fR
\&.ft
.fi
.if n \{\
.RE
.\}
.sp
\fB1. \fRThis removes the file from the index while keeping it in the working directory\&.
.br
\fB2. \fRThis commits all other changes in the index\&.
.br
\fB3. \fRAdds the file to the index again\&.
.br
.RE
.SH "AUTHOR"
Written by Junio C Hamano and Linus Torvalds
.SH "DOCUMENTATION"
Documentation by Junio C Hamano and the git\-list \&.
.SH "GIT"
Part of the linkgit:git[7] suite
.SH "NOTES"
.IP " 1." 4
junkio@cox.net
.RS 4
\%mailto:junkio@cox.net
.RE
.IP " 2." 4
torvalds@osdl.org
.RS 4
\%mailto:torvalds@osdl.org
.RE
.IP " 3." 4
git@vger.kernel.org
.RS 4
\%mailto:git@vger.kernel.org
.RE