]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/git-stash.txt
doc txt & -h consistency: make "stash" consistent
[thirdparty/git.git] / Documentation / git-stash.txt
CommitLineData
09ccdb63
NS
1git-stash(1)
2============
3
4NAME
5----
6git-stash - Stash the changes in a dirty working directory away
7
8SYNOPSIS
9--------
10[verse]
d6ab8b19 11'git stash' list [<log-options>]
00751215
ÆAB
12'git stash' show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
13'git stash' drop [-q | --quiet] [<stash>]
951ec747
ÆAB
14'git stash' pop [--index] [-q | --quiet] [<stash>]
15'git stash' apply [--index] [-q | --quiet] [<stash>]
656b5034 16'git stash' branch <branchname> [<stash>]
00751215
ÆAB
17'git stash' [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
18 [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]
8a98758a 19 [--pathspec-from-file=<file> [--pathspec-file-nul]]
1ada5020 20 [--] [<pathspec>...]]
951ec747
ÆAB
21'git stash' save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
22 [-u | --include-untracked] [-a | --all] [<message>]
656b5034 23'git stash' clear
2be43516 24'git stash' create [<message>]
00751215 25'git stash' store [(-m | --message) <message>] [-q | --quiet] <commit>
09ccdb63
NS
26
27DESCRIPTION
28-----------
29
ca768288 30Use `git stash` when you want to record the current state of the
09ccdb63
NS
31working directory and the index, but want to go back to a clean
32working directory. The command saves your local modifications away
33and reverts the working directory to match the `HEAD` commit.
34
35The modifications stashed away by this command can be listed with
483bc4f0
JN
36`git stash list`, inspected with `git stash show`, and restored
37(potentially on top of a different commit) with `git stash apply`.
db37745e 38Calling `git stash` without any arguments is equivalent to `git stash push`.
483bc4f0 39A stash is by default listed as "WIP on 'branchname' ...", but
ec96e0f6
NS
40you can give a more descriptive message on the command line when
41you create one.
09ccdb63 42
cc1b8d8b 43The latest stash you created is stored in `refs/stash`; older
9488e875 44stashes are found in the reflog of this reference and can be named using
6cf378f0
JK
45the usual reflog syntax (e.g. `stash@{0}` is the most recently
46created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}`
a56c8f5a
AW
47is also possible). Stashes may also be referenced by specifying just the
48stash index (e.g. the integer `n` is equivalent to `stash@{n}`).
09ccdb63 49
0093abc2
AM
50COMMANDS
51--------
09ccdb63 52
d4056dba 53push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [(-m|--message) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]::
09ccdb63 54
e01db917 55 Save your local modifications to a new 'stash entry' and roll them
20a7e061
TG
56 back to HEAD (in the working tree and in the index).
57 The <message> part is optional and gives
9e140909
TG
58 the description along with the stashed state.
59+
60For quickly making a snapshot, you can omit "push". In this mode,
61non-option arguments are not allowed to prevent a misspelled
e01db917 62subcommand from making an unwanted stash entry. The two exceptions to this
3f3d8068 63are `stash -p` which acts as alias for `stash push -p` and pathspec elements,
9e140909 64which are allowed after a double hyphen `--` for disambiguation.
09ccdb63 65
41a28eb6 66save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
fd2ebf14
TG
67
68 This option is deprecated in favour of 'git stash push'. It
3f3d8068 69 differs from "stash push" in that it cannot take pathspec.
57d8f4b4
JS
70 Instead, all non-option arguments are concatenated to form the stash
71 message.
fd2ebf14 72
d6ab8b19 73list [<log-options>]::
09ccdb63 74
e01db917
LB
75 List the stash entries that you currently have. Each 'stash entry' is
76 listed with its name (e.g. `stash@{0}` is the latest entry, `stash@{1}` is
9488e875 77 the one before, etc.), the name of the branch that was current when the
e01db917 78 entry was made, and a short description of the commit the entry was
09ccdb63
NS
79 based on.
80+
81----------------------------------------------------------------
ec96e0f6
NS
82stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
83stash@{1}: On master: 9cc0589... Add git-stash
09ccdb63 84----------------------------------------------------------------
fbd538c2 85+
0b444cdb 86The command takes options applicable to the 'git log'
b7b10385 87command to control what is shown and how. See linkgit:git-log[1].
09ccdb63 88
d3c7bf73 89show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]::
09ccdb63 90
e01db917
LB
91 Show the changes recorded in the stash entry as a diff between the
92 stashed contents and the commit back when the stash entry was first
0093abc2 93 created.
e01db917
LB
94 By default, the command shows the diffstat, but it will accept any
95 format known to 'git diff' (e.g., `git stash show -p stash@{1}`
96 to view the second most recent entry in patch form).
af5cd44b
DL
97 If no `<diff-option>` is provided, the default behavior will be given
98 by the `stash.showStat`, and `stash.showPatch` config variables. You
99 can also use `stash.showIncludeUntracked` to set whether
100 `--include-untracked` is enabled by default.
09ccdb63 101
fcdd0e92 102pop [--index] [-q|--quiet] [<stash>]::
09ccdb63 103
d1836637
TR
104 Remove a single stashed state from the stash list and apply it
105 on top of the current working tree state, i.e., do the inverse
db37745e 106 operation of `git stash push`. The working directory must
d1836637 107 match the index.
9488e875 108+
d1836637
TR
109Applying the state can fail with conflicts; in this case, it is not
110removed from the stash list. You need to resolve the conflicts by hand
111and call `git stash drop` manually afterwards.
f39d6ee2 112
fcdd0e92 113apply [--index] [-q|--quiet] [<stash>]::
f39d6ee2 114
b0c6bf4a
JS
115 Like `pop`, but do not remove the state from the stash list. Unlike `pop`,
116 `<stash>` may be any commit that looks like a commit created by
db37745e 117 `stash push` or `stash create`.
09ccdb63 118
656b5034
AMS
119branch <branchname> [<stash>]::
120
121 Creates and checks out a new branch named `<branchname>` starting from
122 the commit at which the `<stash>` was originally created, applies the
b0c6bf4a
JS
123 changes recorded in `<stash>` to the new working tree and index.
124 If that succeeds, and `<stash>` is a reference of the form
0093abc2 125 `stash@{<revision>}`, it then drops the `<stash>`.
656b5034 126+
db37745e 127This is useful if the branch on which you ran `git stash push` has
656b5034 128changed enough that `git stash apply` fails due to conflicts. Since
e01db917
LB
129the stash entry is applied on top of the commit that was HEAD at the
130time `git stash` was run, it restores the originally stashed state
131with no conflicts.
656b5034 132
09ccdb63 133clear::
e01db917 134 Remove all the stash entries. Note that those entries will then
f5f1e164
TR
135 be subject to pruning, and may be impossible to recover (see
136 'Examples' below for a possible strategy).
09ccdb63 137
fcdd0e92 138drop [-q|--quiet] [<stash>]::
e25d5f9c 139
e01db917 140 Remove a single stash entry from the list of stash entries.
e25d5f9c 141
a5ab00c5
SB
142create::
143
e01db917
LB
144 Create a stash entry (which is a regular commit object) and
145 return its object name, without storing it anywhere in the ref
146 namespace.
2be43516 147 This is intended to be useful for scripts. It is probably not
0d5f844f 148 the command you want to use; see "push" above.
a5ab00c5 149
bd514cad
RR
150store::
151
152 Store a given stash created via 'git stash create' (which is a
153 dangling merge commit) in the stash ref, updating the stash
154 reflog. This is intended to be useful for scripts. It is
0d5f844f 155 probably not the command you want to use; see "push" above.
09ccdb63 156
0093abc2
AM
157OPTIONS
158-------
159-a::
160--all::
161 This option is only valid for `push` and `save` commands.
162+
163All ignored and untracked files are also stashed and then cleaned
164up with `git clean`.
2b7460d1 165
0093abc2
AM
166-u::
167--include-untracked::
d3c7bf73
DL
168--no-include-untracked::
169 When used with the `push` and `save` commands,
170 all untracked files are also stashed and then cleaned up with
171 `git clean`.
172+
173When used with the `show` command, show the untracked files in the stash
174entry as part of the diff.
175
176--only-untracked::
177 This option is only valid for the `show` command.
0093abc2 178+
d3c7bf73 179Show only the untracked files in the stash entry as part of the diff.
2b7460d1 180
0093abc2
AM
181--index::
182 This option is only valid for `pop` and `apply` commands.
183+
184Tries to reinstate not only the working tree's changes, but also
185the index's ones. However, this can fail, when you have conflicts
186(which are stored in the index, where you therefore can no longer
187apply the changes as they were originally).
188
189-k::
190--keep-index::
191--no-keep-index::
192 This option is only valid for `push` and `save` commands.
193+
194All changes already added to the index are left intact.
2b7460d1 195
0093abc2
AM
196-p::
197--patch::
198 This option is only valid for `push` and `save` commands.
199+
200Interactively select hunks from the diff between HEAD and the
201working tree to be stashed. The stash entry is constructed such
202that its index state is the same as the index state of your
203repository, and its worktree contains only the changes you selected
204interactively. The selected changes are then rolled back from your
205worktree. See the ``Interactive Mode'' section of linkgit:git-add[1]
206to learn how to operate the `--patch` mode.
2b7460d1
AM
207+
208The `--patch` option implies `--keep-index`. You can use
209`--no-keep-index` to override this.
210
41a28eb6
SO
211-S::
212--staged::
213 This option is only valid for `push` and `save` commands.
214+
215Stash only the changes that are currently staged. This is similar to
216basic `git commit` except the state is committed to the stash instead
217of current branch.
218+
219The `--patch` option has priority over this one.
220
8a98758a
AM
221--pathspec-from-file=<file>::
222 This option is only valid for `push` command.
223+
224Pathspec is passed in `<file>` instead of commandline args. If
225`<file>` is exactly `-` then standard input is used. Pathspec
226elements are separated by LF or CR/LF. Pathspec elements can be
227quoted as explained for the configuration variable `core.quotePath`
228(see linkgit:git-config[1]). See also `--pathspec-file-nul` and
229global `--literal-pathspecs`.
230
231--pathspec-file-nul::
232 This option is only valid for `push` command.
233+
234Only meaningful with `--pathspec-from-file`. Pathspec elements are
235separated with NUL character and all other characters are taken
236literally (including newlines and quotes).
237
b2290914
AM
238-q::
239--quiet::
240 This option is only valid for `apply`, `drop`, `pop`, `push`,
241 `save`, `store` commands.
242+
243Quiet, suppress feedback messages.
244
245\--::
246 This option is only valid for `push` command.
247+
248Separates pathspec from options for disambiguation purposes.
249
0093abc2
AM
250<pathspec>...::
251 This option is only valid for `push` command.
252+
253The new stash entry records the modified states only for the files
254that match the pathspec. The index entries and working tree files
255are then rolled back to the state in HEAD only for these files,
256too, leaving files that do not match the pathspec intact.
3f3d8068
AM
257+
258For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
0093abc2
AM
259
260<stash>::
261 This option is only valid for `apply`, `branch`, `drop`, `pop`,
262 `show` commands.
263+
264A reference of the form `stash@{<revision>}`. When no `<stash>` is
265given, the latest stash is assumed (that is, `stash@{0}`).
2b7460d1 266
09ccdb63
NS
267DISCUSSION
268----------
269
e01db917
LB
270A stash entry is represented as a commit whose tree records the state
271of the working directory, and its first parent is the commit at `HEAD`
272when the entry was created. The tree of the second parent records the
273state of the index when the entry is made, and it is made a child of
09ccdb63
NS
274the `HEAD` commit. The ancestry graph looks like this:
275
276 .----W
277 / /
114fd812 278 -----H----I
09ccdb63
NS
279
280where `H` is the `HEAD` commit, `I` is a commit that records the state
281of the index, and `W` is a commit that records the state of the working
282tree.
283
284
285EXAMPLES
286--------
287
288Pulling into a dirty tree::
289
290When you are in the middle of something, you learn that there are
9488e875
JH
291upstream changes that are possibly relevant to what you are
292doing. When your local changes do not conflict with the changes in
09ccdb63
NS
293the upstream, a simple `git pull` will let you move forward.
294+
295However, there are cases in which your local changes do conflict with
296the upstream changes, and `git pull` refuses to overwrite your
9488e875 297changes. In such a case, you can stash your changes away,
09ccdb63
NS
298perform a pull, and then unstash, like this:
299+
300----------------------------------------------------------------
301$ git pull
9da6f0ff 302 ...
09ccdb63
NS
303file foobar not up to date, cannot merge.
304$ git stash
305$ git pull
d1836637 306$ git stash pop
09ccdb63
NS
307----------------------------------------------------------------
308
309Interrupted workflow::
310
311When you are in the middle of something, your boss comes in and
9488e875 312demands that you fix something immediately. Traditionally, you would
09ccdb63 313make a commit to a temporary branch to store your changes away, and
9488e875 314return to your original branch to make the emergency fix, like this:
09ccdb63
NS
315+
316----------------------------------------------------------------
9da6f0ff 317# ... hack hack hack ...
328c6cb8 318$ git switch -c my_wip
09ccdb63 319$ git commit -a -m "WIP"
328c6cb8 320$ git switch master
09ccdb63
NS
321$ edit emergency fix
322$ git commit -a -m "Fix in a hurry"
328c6cb8 323$ git switch my_wip
09ccdb63 324$ git reset --soft HEAD^
9da6f0ff 325# ... continue hacking ...
09ccdb63
NS
326----------------------------------------------------------------
327+
0b444cdb 328You can use 'git stash' to simplify the above, like this:
09ccdb63
NS
329+
330----------------------------------------------------------------
9da6f0ff 331# ... hack hack hack ...
09ccdb63
NS
332$ git stash
333$ edit emergency fix
334$ git commit -a -m "Fix in a hurry"
d1836637 335$ git stash pop
9da6f0ff 336# ... continue hacking ...
09ccdb63
NS
337----------------------------------------------------------------
338
7bedebca
SG
339Testing partial commits::
340
db37745e 341You can use `git stash push --keep-index` when you want to make two or
7bedebca
SG
342more commits out of the changes in the work tree, and you want to test
343each change before committing:
344+
345----------------------------------------------------------------
9da6f0ff 346# ... hack hack hack ...
caf18996 347$ git add --patch foo # add just first part to the index
db37745e 348$ git stash push --keep-index # save all other changes to the stash
caf18996 349$ edit/build/test first part
f733c709 350$ git commit -m 'First part' # commit fully tested change
caf18996 351$ git stash pop # prepare to work on all other changes
9da6f0ff 352# ... repeat above five steps until one commit remains ...
caf18996
ER
353$ edit/build/test remaining parts
354$ git commit foo -m 'Remaining parts'
7bedebca
SG
355----------------------------------------------------------------
356
41a28eb6
SO
357Saving unrelated changes for future use::
358
359When you are in the middle of massive changes and you find some
360unrelated issue that you don't want to forget to fix, you can do the
361change(s), stage them, and use `git stash push --staged` to stash them
362out for future use. This is similar to committing the staged changes,
363only the commit ends-up being in the stash and not on the current branch.
364+
365----------------------------------------------------------------
366# ... hack hack hack ...
367$ git add --patch foo # add unrelated changes to the index
368$ git stash push --staged # save these changes to the stash
369# ... hack hack hack, finish curent changes ...
370$ git commit -m 'Massive' # commit fully tested changes
371$ git switch fixup-branch # switch to another branch
372$ git stash pop # to finish work on the saved changes
373----------------------------------------------------------------
374
e01db917 375Recovering stash entries that were cleared/dropped erroneously::
f5f1e164 376
e01db917 377If you mistakenly drop or clear stash entries, they cannot be recovered
f5f1e164 378through the normal safety mechanisms. However, you can try the
e01db917
LB
379following incantation to get a list of stash entries that are still in
380your repository, but not reachable any more:
f5f1e164
TR
381+
382----------------------------------------------------------------
383git fsck --unreachable |
384grep commit | cut -d\ -f3 |
385xargs git log --merges --no-walk --grep=WIP
386----------------------------------------------------------------
387
388
09ccdb63
NS
389SEE ALSO
390--------
5162e697
DM
391linkgit:git-checkout[1],
392linkgit:git-commit[1],
393linkgit:git-reflog[1],
328c6cb8
NTND
394linkgit:git-reset[1],
395linkgit:git-switch[1]
09ccdb63 396
09ccdb63
NS
397GIT
398---
9e1f0a85 399Part of the linkgit:git[1] suite