blob: 53e1a1205d3088ed83300df89a02216dd46e556f [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
Junio C Hamanod52ae632019-10-23 05:33:3190differs from "stash push" in that it cannot take pathspecs.
91Instead, all non-option arguments are concatenated to form the stash
92message.
Junio C Hamano3a9c0342017-11-10 06:01:1293
Junio C Hamano83d46a22008-02-21 02:29:4294list [<options>]::
Junio C Hamano1d90cb02007-07-03 07:05:3195
Junio C Hamano967cda72017-06-30 21:49:5396List the stash entries that you currently have. Each 'stash entry' is
97listed with its name (e.g. `stash@{0}` is the latest entry, `stash@{1}` is
Junio C Hamano1d90cb02007-07-03 07:05:3198the one before, etc.), the name of the branch that was current when the
Junio C Hamano967cda72017-06-30 21:49:5399entry was made, and a short description of the commit the entry was
Junio C Hamano1d90cb02007-07-03 07:05:31100based on.
101+
102----------------------------------------------------------------
Junio C Hamanobb6e0782007-07-19 02:14:50103stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
104stash@{1}: On master: 9cc0589... Add git-stash
Junio C Hamano1d90cb02007-07-03 07:05:31105----------------------------------------------------------------
Junio C Hamano83d46a22008-02-21 02:29:42106+
Junio C Hamano1aa40d22010-01-21 17:46:43107The command takes options applicable to the 'git log'
Junio C Hamanoc21ab052009-10-31 04:03:55108command to control what is shown and how. See linkgit:git-log[1].
Junio C Hamano1d90cb02007-07-03 07:05:31109
Junio C Hamanob5513772019-04-22 03:38:39110show [<options>] [<stash>]::
Junio C Hamano1d90cb02007-07-03 07:05:31111
Junio C Hamano967cda72017-06-30 21:49:53112Show the changes recorded in the stash entry as a diff between the
113stashed contents and the commit back when the stash entry was first
114created. When no `<stash>` is given, it shows the latest one.
115By default, the command shows the diffstat, but it will accept any
116format known to 'git diff' (e.g., `git stash show -p stash@{1}`
117to view the second most recent entry in patch form).
Junio C Hamano1eb56092015-10-05 20:39:53118You can use stash.showStat and/or stash.showPatch config variables
119to change the default behavior.
Junio C Hamano1d90cb02007-07-03 07:05:31120
Junio C Hamano2c14c8d2009-07-02 03:17:00121pop [--index] [-q|--quiet] [<stash>]::
Junio C Hamano7d3275e2009-05-31 21:53:30122
123Remove a single stashed state from the stash list and apply it
124on top of the current working tree state, i.e., do the inverse
Junio C Hamano3a9c0342017-11-10 06:01:12125operation of `git stash push`. The working directory must
Junio C Hamano7d3275e2009-05-31 21:53:30126match the index.
127+
128Applying the state can fail with conflicts; in this case, it is not
129removed from the stash list. You need to resolve the conflicts by hand
130and call `git stash drop` manually afterwards.
131+
Junio C Hamano58992c92007-10-01 16:23:18132If the `--index` option is used, then tries to reinstate not only the working
133tree's changes, but also the index's ones. However, this can fail, when you
134have conflicts (which are stored in the index, where you therefore can no
135longer apply the changes as they were originally).
Junio C Hamanof068d542009-06-09 15:46:41136+
Junio C Hamanob76a6862012-05-02 22:02:46137When no `<stash>` is given, `stash@{0}` is assumed, otherwise `<stash>` must
138be a reference of the form `stash@{<revision>}`.
Junio C Hamanof068d542009-06-09 15:46:41139
Junio C Hamano2c14c8d2009-07-02 03:17:00140apply [--index] [-q|--quiet] [<stash>]::
Junio C Hamanof068d542009-06-09 15:46:41141
Junio C Hamanof0f41ba2010-09-04 16:23:06142Like `pop`, but do not remove the state from the stash list. Unlike `pop`,
143`<stash>` may be any commit that looks like a commit created by
Junio C Hamano3a9c0342017-11-10 06:01:12144`stash push` or `stash create`.
Junio C Hamano1d90cb02007-07-03 07:05:31145
Junio C Hamano46a38aa2008-07-14 03:13:27146branch <branchname> [<stash>]::
147
148Creates and checks out a new branch named `<branchname>` starting from
149the commit at which the `<stash>` was originally created, applies the
Junio C Hamanof0f41ba2010-09-04 16:23:06150changes recorded in `<stash>` to the new working tree and index.
151If that succeeds, and `<stash>` is a reference of the form
152`stash@{<revision>}`, it then drops the `<stash>`. When no `<stash>`
Junio C Hamano46a38aa2008-07-14 03:13:27153is given, applies the latest one.
154+
Junio C Hamano3a9c0342017-11-10 06:01:12155This is useful if the branch on which you ran `git stash push` has
Junio C Hamano46a38aa2008-07-14 03:13:27156changed enough that `git stash apply` fails due to conflicts. Since
Junio C Hamano967cda72017-06-30 21:49:53157the stash entry is applied on top of the commit that was HEAD at the
158time `git stash` was run, it restores the originally stashed state
159with no conflicts.
Junio C Hamano46a38aa2008-07-14 03:13:27160
Junio C Hamano1d90cb02007-07-03 07:05:31161clear::
Junio C Hamano967cda72017-06-30 21:49:53162Remove all the stash entries. Note that those entries will then
Junio C Hamano9f883862009-08-11 06:23:52163be subject to pruning, and may be impossible to recover (see
164'Examples' below for a possible strategy).
Junio C Hamano1d90cb02007-07-03 07:05:31165
Junio C Hamano2c14c8d2009-07-02 03:17:00166drop [-q|--quiet] [<stash>]::
Junio C Hamano86bcccc2008-03-08 09:33:55167
Junio C Hamano967cda72017-06-30 21:49:53168Remove a single stash entry from the list of stash entries.
169When no `<stash>` is given, it removes the latest one.
170i.e. `stash@{0}`, otherwise `<stash>` must be a valid stash
171log reference of the form `stash@{<revision>}`.
Junio C Hamano86bcccc2008-03-08 09:33:55172
Junio C Hamano9e96a1a2008-08-16 10:23:18173create::
174
Junio C Hamano967cda72017-06-30 21:49:53175Create a stash entry (which is a regular commit object) and
176return its object name, without storing it anywhere in the ref
177namespace.
Junio C Hamano50757392013-06-27 22:26:58178This is intended to be useful for scripts. It is probably not
Junio C Hamano912712b2017-12-06 18:04:01179the command you want to use; see "push" above.
Junio C Hamano9e96a1a2008-08-16 10:23:18180
Junio C Hamano50757392013-06-27 22:26:58181store::
182
183Store a given stash created via 'git stash create' (which is a
184dangling merge commit) in the stash ref, updating the stash
185reflog. This is intended to be useful for scripts. It is
Junio C Hamano912712b2017-12-06 18:04:01186probably not the command you want to use; see "push" above.
Junio C Hamano1d90cb02007-07-03 07:05:31187
188DISCUSSION
189----------
190
Junio C Hamano967cda72017-06-30 21:49:53191A stash entry is represented as a commit whose tree records the state
192of the working directory, and its first parent is the commit at `HEAD`
193when the entry was created. The tree of the second parent records the
194state of the index when the entry is made, and it is made a child of
Junio C Hamano1d90cb02007-07-03 07:05:31195the `HEAD` commit. The ancestry graph looks like this:
196
197 .----W
198 / /
Junio C Hamano28d8ede2007-07-05 05:51:38199 -----H----I
Junio C Hamano1d90cb02007-07-03 07:05:31200
201where `H` is the `HEAD` commit, `I` is a commit that records the state
202of the index, and `W` is a commit that records the state of the working
203tree.
204
205
206EXAMPLES
207--------
208
209Pulling into a dirty tree::
210
211When you are in the middle of something, you learn that there are
212upstream changes that are possibly relevant to what you are
213doing. When your local changes do not conflict with the changes in
214the upstream, a simple `git pull` will let you move forward.
215+
216However, there are cases in which your local changes do conflict with
217the upstream changes, and `git pull` refuses to overwrite your
218changes. In such a case, you can stash your changes away,
219perform a pull, and then unstash, like this:
220+
221----------------------------------------------------------------
222$ git pull
Junio C Hamanoa2f46622008-09-03 05:20:31223 ...
Junio C Hamano1d90cb02007-07-03 07:05:31224file foobar not up to date, cannot merge.
225$ git stash
226$ git pull
Junio C Hamano7d3275e2009-05-31 21:53:30227$ git stash pop
Junio C Hamano1d90cb02007-07-03 07:05:31228----------------------------------------------------------------
229
230Interrupted workflow::
231
232When you are in the middle of something, your boss comes in and
233demands that you fix something immediately. Traditionally, you would
234make a commit to a temporary branch to store your changes away, and
235return to your original branch to make the emergency fix, like this:
236+
237----------------------------------------------------------------
Junio C Hamanoa2f46622008-09-03 05:20:31238# ... hack hack hack ...
Junio C Hamanoc9f11c22019-07-10 02:54:04239$ git switch -c my_wip
Junio C Hamano1d90cb02007-07-03 07:05:31240$ git commit -a -m "WIP"
Junio C Hamanoc9f11c22019-07-10 02:54:04241$ git switch master
Junio C Hamano1d90cb02007-07-03 07:05:31242$ edit emergency fix
243$ git commit -a -m "Fix in a hurry"
Junio C Hamanoc9f11c22019-07-10 02:54:04244$ git switch my_wip
Junio C Hamano1d90cb02007-07-03 07:05:31245$ git reset --soft HEAD^
Junio C Hamanoa2f46622008-09-03 05:20:31246# ... continue hacking ...
Junio C Hamano1d90cb02007-07-03 07:05:31247----------------------------------------------------------------
248+
Junio C Hamano1aa40d22010-01-21 17:46:43249You can use 'git stash' to simplify the above, like this:
Junio C Hamano1d90cb02007-07-03 07:05:31250+
251----------------------------------------------------------------
Junio C Hamanoa2f46622008-09-03 05:20:31252# ... hack hack hack ...
Junio C Hamano1d90cb02007-07-03 07:05:31253$ git stash
254$ edit emergency fix
255$ git commit -a -m "Fix in a hurry"
Junio C Hamano7d3275e2009-05-31 21:53:30256$ git stash pop
Junio C Hamanoa2f46622008-09-03 05:20:31257# ... continue hacking ...
Junio C Hamano1d90cb02007-07-03 07:05:31258----------------------------------------------------------------
259
Junio C Hamano46a38aa2008-07-14 03:13:27260Testing partial commits::
261
Junio C Hamano3a9c0342017-11-10 06:01:12262You can use `git stash push --keep-index` when you want to make two or
Junio C Hamano46a38aa2008-07-14 03:13:27263more commits out of the changes in the work tree, and you want to test
264each change before committing:
265+
266----------------------------------------------------------------
Junio C Hamanoa2f46622008-09-03 05:20:31267# ... hack hack hack ...
Junio C Hamano46a38aa2008-07-14 03:13:27268$ git add --patch foo # add just first part to the index
Junio C Hamano3a9c0342017-11-10 06:01:12269$ git stash push --keep-index # save all other changes to the stash
Junio C Hamano46a38aa2008-07-14 03:13:27270$ edit/build/test first part
Junio C Hamanoa2f46622008-09-03 05:20:31271$ git commit -m 'First part' # commit fully tested change
Junio C Hamano46a38aa2008-07-14 03:13:27272$ git stash pop # prepare to work on all other changes
Junio C Hamanoa2f46622008-09-03 05:20:31273# ... repeat above five steps until one commit remains ...
Junio C Hamano46a38aa2008-07-14 03:13:27274$ edit/build/test remaining parts
275$ git commit foo -m 'Remaining parts'
276----------------------------------------------------------------
277
Junio C Hamano967cda72017-06-30 21:49:53278Recovering stash entries that were cleared/dropped erroneously::
Junio C Hamano9f883862009-08-11 06:23:52279
Junio C Hamano967cda72017-06-30 21:49:53280If you mistakenly drop or clear stash entries, they cannot be recovered
Junio C Hamano9f883862009-08-11 06:23:52281through the normal safety mechanisms. However, you can try the
Junio C Hamano967cda72017-06-30 21:49:53282following incantation to get a list of stash entries that are still in
283your repository, but not reachable any more:
Junio C Hamano9f883862009-08-11 06:23:52284+
285----------------------------------------------------------------
286git fsck --unreachable |
287grep commit | cut -d\ -f3 |
288xargs git log --merges --no-walk --grep=WIP
289----------------------------------------------------------------
290
291
Junio C Hamano1d90cb02007-07-03 07:05:31292SEE ALSO
293--------
Junio C Hamano35738e82008-01-07 07:55:46294linkgit:git-checkout[1],
295linkgit:git-commit[1],
296linkgit:git-reflog[1],
Junio C Hamanoc9f11c22019-07-10 02:54:04297linkgit:git-reset[1],
298linkgit:git-switch[1]
Junio C Hamano1d90cb02007-07-03 07:05:31299
Junio C Hamano1d90cb02007-07-03 07:05:31300GIT
301---
Junio C Hamanof7c042d2008-06-06 22:50:53302Part of the linkgit:git[1] suite