blob: 8fbe12c66c823bce8756eaf3c836d5e8f0f7a340 [file] [log] [blame]
Junio C Hamano1d90cb02007-07-03 07:05:311git-stash(1)
2============
3
4NAME
5----
6git-stash - Stash the changes in a dirty working directory away
7
8SYNOPSIS
9--------
10[verse]
Junio C Hamano9e96a1a2008-08-16 10:23:1811'git stash' list [<options>]
Junio C Hamanob5513772019-04-22 03:38:3912'git stash' show [<options>] [<stash>]
Junio C Hamano2c14c8d2009-07-02 03:17:0013'git stash' drop [-q|--quiet] [<stash>]
14'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>]
Junio C Hamano46a38aa2008-07-14 03:13:2715'git stash' branch <branchname> [<stash>]
Junio C Hamano53eec4d2017-03-10 23:02:3616'git stash' [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
Junio C Hamanoeeffc412018-03-28 19:41:5417 [-u|--include-untracked] [-a|--all] [-m|--message <message>]
Junio C Hamano53eec4d2017-03-10 23:02:3618 [--] [<pathspec>...]]
Junio C Hamano46a38aa2008-07-14 03:13:2719'git stash' clear
Junio C Hamano50757392013-06-27 22:26:5820'git stash' create [<message>]
21'git stash' store [-m|--message <message>] [-q|--quiet] <commit>
Junio C Hamano1d90cb02007-07-03 07:05:3122
23DESCRIPTION
24-----------
25
Junio C Hamano1aa40d22010-01-21 17:46:4326Use `git stash` when you want to record the current state of the
Junio C Hamano1d90cb02007-07-03 07:05:3127working directory and the index, but want to go back to a clean
28working directory. The command saves your local modifications away
29and reverts the working directory to match the `HEAD` commit.
30
31The modifications stashed away by this command can be listed with
Junio C Hamanofce7c7e2008-07-02 03:06:3832`git stash list`, inspected with `git stash show`, and restored
33(potentially on top of a different commit) with `git stash apply`.
Junio C Hamano3a9c0342017-11-10 06:01:1234Calling `git stash` without any arguments is equivalent to `git stash push`.
Junio C Hamanofce7c7e2008-07-02 03:06:3835A stash is by default listed as "WIP on 'branchname' ...", but
Junio C Hamanobb6e0782007-07-19 02:14:5036you can give a more descriptive message on the command line when
37you create one.
Junio C Hamano1d90cb02007-07-03 07:05:3138
Junio C Hamano4fdccb22010-02-19 09:58:1439The latest stash you created is stored in `refs/stash`; older
Junio C Hamano1d90cb02007-07-03 07:05:3140stashes are found in the reflog of this reference and can be named using
Junio C Hamanob76a6862012-05-02 22:02:4641the usual reflog syntax (e.g. `stash@{0}` is the most recently
42created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}`
Junio C Hamanof2f28b12016-10-31 21:41:5843is also possible). Stashes may also be referenced by specifying just the
44stash index (e.g. the integer `n` is equivalent to `stash@{n}`).
Junio C Hamano1d90cb02007-07-03 07:05:3145
46OPTIONS
47-------
48
Junio C Hamano53eec4d2017-03-10 23:02:3649push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>...]::
Junio C Hamano1d90cb02007-07-03 07:05:3150
Junio C Hamano967cda72017-06-30 21:49:5351Save your local modifications to a new 'stash entry' and roll them
Junio C Hamanoe89102f2017-02-15 23:18:1552back to HEAD (in the working tree and in the index).
53The <message> part is optional and gives
Junio C Hamano53eec4d2017-03-10 23:02:3654the description along with the stashed state.
55+
56For quickly making a snapshot, you can omit "push". In this mode,
57non-option arguments are not allowed to prevent a misspelled
Junio C Hamano967cda72017-06-30 21:49:5358subcommand from making an unwanted stash entry. The two exceptions to this
Junio C Hamano53eec4d2017-03-10 23:02:3659are `stash -p` which acts as alias for `stash push -p` and pathspecs,
60which are allowed after a double hyphen `--` for disambiguation.
61+
Junio C Hamano967cda72017-06-30 21:49:5362When pathspec is given to 'git stash push', the new stash entry records the
Junio C Hamano53eec4d2017-03-10 23:02:3663modified states only for the files that match the pathspec. The index
64entries and working tree files are then rolled back to the state in
65HEAD only for these files, too, leaving files that do not match the
66pathspec intact.
Junio C Hamano46a38aa2008-07-14 03:13:2767+
68If the `--keep-index` option is used, all changes already added to the
69index are left intact.
Junio C Hamanoc28068f2009-09-08 00:55:2370+
Junio C Hamano15567bc2011-07-23 00:51:5971If the `--include-untracked` option is used, all untracked files are also
72stashed and then cleaned up with `git clean`, leaving the working directory
73in a very clean state. If the `--all` option is used instead then the
74ignored files are stashed and cleaned in addition to the untracked files.
75+
Junio C Hamano9eb58352011-05-11 20:09:2476With `--patch`, you can interactively select hunks from the diff
Junio C Hamanoc28068f2009-09-08 00:55:2377between HEAD and the working tree to be stashed. The stash entry is
78constructed such that its index state is the same as the index state
79of your repository, and its worktree contains only the changes you
80selected interactively. The selected changes are then rolled back
Junio C Hamano9eb58352011-05-11 20:09:2481from your worktree. See the ``Interactive Mode'' section of
Junio C Hamanob76a6862012-05-02 22:02:4682linkgit:git-add[1] to learn how to operate the `--patch` mode.
Junio C Hamanoc28068f2009-09-08 00:55:2383+
84The `--patch` option implies `--keep-index`. You can use
85`--no-keep-index` to override this.
Junio C Hamano1d90cb02007-07-03 07:05:3186
Junio C Hamano3a9c0342017-11-10 06:01:1287save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
88
89This option is deprecated in favour of 'git stash push'. It
90differs from "stash push" in that it cannot take pathspecs,
91and any non-option arguments form the message.
92
Junio C Hamano83d46a22008-02-21 02:29:4293list [<options>]::
Junio C Hamano1d90cb02007-07-03 07:05:3194
Junio C Hamano967cda72017-06-30 21:49:5395List the stash entries that you currently have. Each 'stash entry' is
96listed with its name (e.g. `stash@{0}` is the latest entry, `stash@{1}` is
Junio C Hamano1d90cb02007-07-03 07:05:3197the one before, etc.), the name of the branch that was current when the
Junio C Hamano967cda72017-06-30 21:49:5398entry was made, and a short description of the commit the entry was
Junio C Hamano1d90cb02007-07-03 07:05:3199based on.
100+
101----------------------------------------------------------------
Junio C Hamanobb6e0782007-07-19 02:14:50102stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
103stash@{1}: On master: 9cc0589... Add git-stash
Junio C Hamano1d90cb02007-07-03 07:05:31104----------------------------------------------------------------
Junio C Hamano83d46a22008-02-21 02:29:42105+
Junio C Hamano1aa40d22010-01-21 17:46:43106The command takes options applicable to the 'git log'
Junio C Hamanoc21ab052009-10-31 04:03:55107command to control what is shown and how. See linkgit:git-log[1].
Junio C Hamano1d90cb02007-07-03 07:05:31108
Junio C Hamanob5513772019-04-22 03:38:39109show [<options>] [<stash>]::
Junio C Hamano1d90cb02007-07-03 07:05:31110
Junio C Hamano967cda72017-06-30 21:49:53111Show the changes recorded in the stash entry as a diff between the
112stashed contents and the commit back when the stash entry was first
113created. When no `<stash>` is given, it shows the latest one.
114By default, the command shows the diffstat, but it will accept any
115format known to 'git diff' (e.g., `git stash show -p stash@{1}`
116to view the second most recent entry in patch form).
Junio C Hamano1eb56092015-10-05 20:39:53117You can use stash.showStat and/or stash.showPatch config variables
118to change the default behavior.
Junio C Hamano1d90cb02007-07-03 07:05:31119
Junio C Hamano2c14c8d2009-07-02 03:17:00120pop [--index] [-q|--quiet] [<stash>]::
Junio C Hamano7d3275e2009-05-31 21:53:30121
122Remove a single stashed state from the stash list and apply it
123on top of the current working tree state, i.e., do the inverse
Junio C Hamano3a9c0342017-11-10 06:01:12124operation of `git stash push`. The working directory must
Junio C Hamano7d3275e2009-05-31 21:53:30125match the index.
126+
127Applying the state can fail with conflicts; in this case, it is not
128removed from the stash list. You need to resolve the conflicts by hand
129and call `git stash drop` manually afterwards.
130+
Junio C Hamano58992c92007-10-01 16:23:18131If the `--index` option is used, then tries to reinstate not only the working
132tree's changes, but also the index's ones. However, this can fail, when you
133have conflicts (which are stored in the index, where you therefore can no
134longer apply the changes as they were originally).
Junio C Hamanof068d542009-06-09 15:46:41135+
Junio C Hamanob76a6862012-05-02 22:02:46136When no `<stash>` is given, `stash@{0}` is assumed, otherwise `<stash>` must
137be a reference of the form `stash@{<revision>}`.
Junio C Hamanof068d542009-06-09 15:46:41138
Junio C Hamano2c14c8d2009-07-02 03:17:00139apply [--index] [-q|--quiet] [<stash>]::
Junio C Hamanof068d542009-06-09 15:46:41140
Junio C Hamanof0f41ba2010-09-04 16:23:06141Like `pop`, but do not remove the state from the stash list. Unlike `pop`,
142`<stash>` may be any commit that looks like a commit created by
Junio C Hamano3a9c0342017-11-10 06:01:12143`stash push` or `stash create`.
Junio C Hamano1d90cb02007-07-03 07:05:31144
Junio C Hamano46a38aa2008-07-14 03:13:27145branch <branchname> [<stash>]::
146
147Creates and checks out a new branch named `<branchname>` starting from
148the commit at which the `<stash>` was originally created, applies the
Junio C Hamanof0f41ba2010-09-04 16:23:06149changes recorded in `<stash>` to the new working tree and index.
150If that succeeds, and `<stash>` is a reference of the form
151`stash@{<revision>}`, it then drops the `<stash>`. When no `<stash>`
Junio C Hamano46a38aa2008-07-14 03:13:27152is given, applies the latest one.
153+
Junio C Hamano3a9c0342017-11-10 06:01:12154This is useful if the branch on which you ran `git stash push` has
Junio C Hamano46a38aa2008-07-14 03:13:27155changed enough that `git stash apply` fails due to conflicts. Since
Junio C Hamano967cda72017-06-30 21:49:53156the stash entry is applied on top of the commit that was HEAD at the
157time `git stash` was run, it restores the originally stashed state
158with no conflicts.
Junio C Hamano46a38aa2008-07-14 03:13:27159
Junio C Hamano1d90cb02007-07-03 07:05:31160clear::
Junio C Hamano967cda72017-06-30 21:49:53161Remove all the stash entries. Note that those entries will then
Junio C Hamano9f883862009-08-11 06:23:52162be subject to pruning, and may be impossible to recover (see
163'Examples' below for a possible strategy).
Junio C Hamano1d90cb02007-07-03 07:05:31164
Junio C Hamano2c14c8d2009-07-02 03:17:00165drop [-q|--quiet] [<stash>]::
Junio C Hamano86bcccc2008-03-08 09:33:55166
Junio C Hamano967cda72017-06-30 21:49:53167Remove a single stash entry from the list of stash entries.
168When no `<stash>` is given, it removes the latest one.
169i.e. `stash@{0}`, otherwise `<stash>` must be a valid stash
170log reference of the form `stash@{<revision>}`.
Junio C Hamano86bcccc2008-03-08 09:33:55171
Junio C Hamano9e96a1a2008-08-16 10:23:18172create::
173
Junio C Hamano967cda72017-06-30 21:49:53174Create a stash entry (which is a regular commit object) and
175return its object name, without storing it anywhere in the ref
176namespace.
Junio C Hamano50757392013-06-27 22:26:58177This is intended to be useful for scripts. It is probably not
Junio C Hamano912712b2017-12-06 18:04:01178the command you want to use; see "push" above.
Junio C Hamano9e96a1a2008-08-16 10:23:18179
Junio C Hamano50757392013-06-27 22:26:58180store::
181
182Store a given stash created via 'git stash create' (which is a
183dangling merge commit) in the stash ref, updating the stash
184reflog. This is intended to be useful for scripts. It is
Junio C Hamano912712b2017-12-06 18:04:01185probably not the command you want to use; see "push" above.
Junio C Hamano1d90cb02007-07-03 07:05:31186
187DISCUSSION
188----------
189
Junio C Hamano967cda72017-06-30 21:49:53190A stash entry is represented as a commit whose tree records the state
191of the working directory, and its first parent is the commit at `HEAD`
192when the entry was created. The tree of the second parent records the
193state of the index when the entry is made, and it is made a child of
Junio C Hamano1d90cb02007-07-03 07:05:31194the `HEAD` commit. The ancestry graph looks like this:
195
196 .----W
197 / /
Junio C Hamano28d8ede2007-07-05 05:51:38198 -----H----I
Junio C Hamano1d90cb02007-07-03 07:05:31199
200where `H` is the `HEAD` commit, `I` is a commit that records the state
201of the index, and `W` is a commit that records the state of the working
202tree.
203
204
205EXAMPLES
206--------
207
208Pulling into a dirty tree::
209
210When you are in the middle of something, you learn that there are
211upstream changes that are possibly relevant to what you are
212doing. When your local changes do not conflict with the changes in
213the upstream, a simple `git pull` will let you move forward.
214+
215However, there are cases in which your local changes do conflict with
216the upstream changes, and `git pull` refuses to overwrite your
217changes. In such a case, you can stash your changes away,
218perform a pull, and then unstash, like this:
219+
220----------------------------------------------------------------
221$ git pull
Junio C Hamanoa2f46622008-09-03 05:20:31222 ...
Junio C Hamano1d90cb02007-07-03 07:05:31223file foobar not up to date, cannot merge.
224$ git stash
225$ git pull
Junio C Hamano7d3275e2009-05-31 21:53:30226$ git stash pop
Junio C Hamano1d90cb02007-07-03 07:05:31227----------------------------------------------------------------
228
229Interrupted workflow::
230
231When you are in the middle of something, your boss comes in and
232demands that you fix something immediately. Traditionally, you would
233make a commit to a temporary branch to store your changes away, and
234return to your original branch to make the emergency fix, like this:
235+
236----------------------------------------------------------------
Junio C Hamanoa2f46622008-09-03 05:20:31237# ... hack hack hack ...
Junio C Hamanoc9f11c22019-07-10 02:54:04238$ git switch -c my_wip
Junio C Hamano1d90cb02007-07-03 07:05:31239$ git commit -a -m "WIP"
Junio C Hamanoc9f11c22019-07-10 02:54:04240$ git switch master
Junio C Hamano1d90cb02007-07-03 07:05:31241$ edit emergency fix
242$ git commit -a -m "Fix in a hurry"
Junio C Hamanoc9f11c22019-07-10 02:54:04243$ git switch my_wip
Junio C Hamano1d90cb02007-07-03 07:05:31244$ git reset --soft HEAD^
Junio C Hamanoa2f46622008-09-03 05:20:31245# ... continue hacking ...
Junio C Hamano1d90cb02007-07-03 07:05:31246----------------------------------------------------------------
247+
Junio C Hamano1aa40d22010-01-21 17:46:43248You can use 'git stash' to simplify the above, like this:
Junio C Hamano1d90cb02007-07-03 07:05:31249+
250----------------------------------------------------------------
Junio C Hamanoa2f46622008-09-03 05:20:31251# ... hack hack hack ...
Junio C Hamano1d90cb02007-07-03 07:05:31252$ git stash
253$ edit emergency fix
254$ git commit -a -m "Fix in a hurry"
Junio C Hamano7d3275e2009-05-31 21:53:30255$ git stash pop
Junio C Hamanoa2f46622008-09-03 05:20:31256# ... continue hacking ...
Junio C Hamano1d90cb02007-07-03 07:05:31257----------------------------------------------------------------
258
Junio C Hamano46a38aa2008-07-14 03:13:27259Testing partial commits::
260
Junio C Hamano3a9c0342017-11-10 06:01:12261You can use `git stash push --keep-index` when you want to make two or
Junio C Hamano46a38aa2008-07-14 03:13:27262more commits out of the changes in the work tree, and you want to test
263each change before committing:
264+
265----------------------------------------------------------------
Junio C Hamanoa2f46622008-09-03 05:20:31266# ... hack hack hack ...
Junio C Hamano46a38aa2008-07-14 03:13:27267$ git add --patch foo # add just first part to the index
Junio C Hamano3a9c0342017-11-10 06:01:12268$ git stash push --keep-index # save all other changes to the stash
Junio C Hamano46a38aa2008-07-14 03:13:27269$ edit/build/test first part
Junio C Hamanoa2f46622008-09-03 05:20:31270$ git commit -m 'First part' # commit fully tested change
Junio C Hamano46a38aa2008-07-14 03:13:27271$ git stash pop # prepare to work on all other changes
Junio C Hamanoa2f46622008-09-03 05:20:31272# ... repeat above five steps until one commit remains ...
Junio C Hamano46a38aa2008-07-14 03:13:27273$ edit/build/test remaining parts
274$ git commit foo -m 'Remaining parts'
275----------------------------------------------------------------
276
Junio C Hamano967cda72017-06-30 21:49:53277Recovering stash entries that were cleared/dropped erroneously::
Junio C Hamano9f883862009-08-11 06:23:52278
Junio C Hamano967cda72017-06-30 21:49:53279If you mistakenly drop or clear stash entries, they cannot be recovered
Junio C Hamano9f883862009-08-11 06:23:52280through the normal safety mechanisms. However, you can try the
Junio C Hamano967cda72017-06-30 21:49:53281following incantation to get a list of stash entries that are still in
282your repository, but not reachable any more:
Junio C Hamano9f883862009-08-11 06:23:52283+
284----------------------------------------------------------------
285git fsck --unreachable |
286grep commit | cut -d\ -f3 |
287xargs git log --merges --no-walk --grep=WIP
288----------------------------------------------------------------
289
290
Junio C Hamano1d90cb02007-07-03 07:05:31291SEE ALSO
292--------
Junio C Hamano35738e82008-01-07 07:55:46293linkgit:git-checkout[1],
294linkgit:git-commit[1],
295linkgit:git-reflog[1],
Junio C Hamanoc9f11c22019-07-10 02:54:04296linkgit:git-reset[1],
297linkgit:git-switch[1]
Junio C Hamano1d90cb02007-07-03 07:05:31298
Junio C Hamano1d90cb02007-07-03 07:05:31299GIT
300---
Junio C Hamanof7c042d2008-06-06 22:50:53301Part of the linkgit:git[1] suite