1git-stash(1) 2============ 3 4NAME 5---- 6git-stash - Stash the changes in a dirty working directory away 7 8SYNOPSIS 9-------- 10[verse] 11'git stash' list [<options>] 12'git stash' show [<options>] [<stash>] 13'git stash' drop [-q|--quiet] [<stash>] 14'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>] 15'git stash' branch <branchname> [<stash>] 16'git stash' [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] 17 [-u|--include-untracked] [-a|--all] [-m|--message <message>] 18 [--] [<pathspec>...]] 19'git stash' clear 20'git stash' create [<message>] 21'git stash' store [-m|--message <message>] [-q|--quiet] <commit> 22 23DESCRIPTION 24----------- 25 26Use `git stash` when you want to record the current state of the 27working 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 32`git stash list`, inspected with `git stash show`, and restored 33(potentially on top of a different commit) with `git stash apply`. 34Calling `git stash` without any arguments is equivalent to `git stash push`. 35A stash is by default listed as "WIP on 'branchname' ...", but 36you can give a more descriptive message on the command line when 37you create one. 38 39The latest stash you created is stored in `refs/stash`; older 40stashes are found in the reflog of this reference and can be named using 41the usual reflog syntax (e.g. `stash@{0}` is the most recently 42created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}` 43is also possible). Stashes may also be referenced by specifying just the 44stash index (e.g. the integer `n` is equivalent to `stash@{n}`). 45 46OPTIONS 47------- 48 49push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>...]:: 50 51 Save your local modifications to a new 'stash entry' and roll them 52 back to HEAD (in the working tree and in the index). 53 The <message> part is optional and gives 54 the 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 58subcommand from making an unwanted stash entry. The two exceptions to this 59are `stash -p` which acts as alias for `stash push -p` and pathspecs, 60which are allowed after a double hyphen `--` for disambiguation. 61+ 62When pathspec is given to 'git stash push', the new stash entry records the 63modified 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. 67+ 68If the `--keep-index` option is used, all changes already added to the 69index are left intact. 70+ 71If 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+ 76With `--patch`, you can interactively select hunks from the diff 77between 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 81from your worktree. See the ``Interactive Mode'' section of 82linkgit:git-add[1] to learn how to operate the `--patch` mode. 83+ 84The `--patch` option implies `--keep-index`. You can use 85`--no-keep-index` to override this. 86 87save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]:: 88 89 This option is deprecated in favour of 'git stash push'. It 90 differs from "stash push" in that it cannot take pathspecs, 91 and any non-option arguments form the message. 92 93list [<options>]:: 94 95 List the stash entries that you currently have. Each 'stash entry' is 96 listed with its name (e.g. `stash@{0}` is the latest entry, `stash@{1}` is 97 the one before, etc.), the name of the branch that was current when the 98 entry was made, and a short description of the commit the entry was 99 based on. 100+ 101---------------------------------------------------------------- 102stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation 103stash@{1}: On master: 9cc0589... Add git-stash 104---------------------------------------------------------------- 105+ 106The command takes options applicable to the 'git log' 107command to control what is shown and how. See linkgit:git-log[1]. 108 109show [<options>] [<stash>]:: 110 111 Show the changes recorded in the stash entry as a diff between the 112 stashed contents and the commit back when the stash entry was first 113 created. When no `<stash>` is given, it shows the latest one. 114 By default, the command shows the diffstat, but it will accept any 115 format known to 'git diff' (e.g., `git stash show -p stash@{1}` 116 to view the second most recent entry in patch form). 117 You can use stash.showStat and/or stash.showPatch config variables 118 to change the default behavior. 119 120pop [--index] [-q|--quiet] [<stash>]:: 121 122 Remove a single stashed state from the stash list and apply it 123 on top of the current working tree state, i.e., do the inverse 124 operation of `git stash push`. The working directory must 125 match 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+ 131If 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). 135+ 136When no `<stash>` is given, `stash@{0}` is assumed, otherwise `<stash>` must 137be a reference of the form `stash@{<revision>}`. 138 139apply [--index] [-q|--quiet] [<stash>]:: 140 141 Like `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 143 `stash push` or `stash create`. 144 145branch <branchname> [<stash>]:: 146 147 Creates and checks out a new branch named `<branchname>` starting from 148 the commit at which the `<stash>` was originally created, applies the 149 changes recorded in `<stash>` to the new working tree and index. 150 If that succeeds, and `<stash>` is a reference of the form 151 `stash@{<revision>}`, it then drops the `<stash>`. When no `<stash>` 152 is given, applies the latest one. 153+ 154This is useful if the branch on which you ran `git stash push` has 155changed enough that `git stash apply` fails due to conflicts. Since 156the 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. 159 160clear:: 161 Remove all the stash entries. Note that those entries will then 162 be subject to pruning, and may be impossible to recover (see 163 'Examples' below for a possible strategy). 164 165drop [-q|--quiet] [<stash>]:: 166 167 Remove a single stash entry from the list of stash entries. 168 When no `<stash>` is given, it removes the latest one. 169 i.e. `stash@{0}`, otherwise `<stash>` must be a valid stash 170 log reference of the form `stash@{<revision>}`. 171 172create:: 173 174 Create a stash entry (which is a regular commit object) and 175 return its object name, without storing it anywhere in the ref 176 namespace. 177 This is intended to be useful for scripts. It is probably not 178 the command you want to use; see "push" above. 179 180store:: 181 182 Store a given stash created via 'git stash create' (which is a 183 dangling merge commit) in the stash ref, updating the stash 184 reflog. This is intended to be useful for scripts. It is 185 probably not the command you want to use; see "push" above. 186 187DISCUSSION 188---------- 189 190A 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 194the `HEAD` commit. The ancestry graph looks like this: 195 196 .----W 197 / / 198 -----H----I 199 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 222 ... 223file foobar not up to date, cannot merge. 224$ git stash 225$ git pull 226$ git stash pop 227---------------------------------------------------------------- 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---------------------------------------------------------------- 237# ... hack hack hack ... 238$ git switch -c my_wip 239$ git commit -a -m "WIP" 240$ git switch master 241$ edit emergency fix 242$ git commit -a -m "Fix in a hurry" 243$ git switch my_wip 244$ git reset --soft HEAD^ 245# ... continue hacking ... 246---------------------------------------------------------------- 247+ 248You can use 'git stash' to simplify the above, like this: 249+ 250---------------------------------------------------------------- 251# ... hack hack hack ... 252$ git stash 253$ edit emergency fix 254$ git commit -a -m "Fix in a hurry" 255$ git stash pop 256# ... continue hacking ... 257---------------------------------------------------------------- 258 259Testing partial commits:: 260 261You can use `git stash push --keep-index` when you want to make two or 262more commits out of the changes in the work tree, and you want to test 263each change before committing: 264+ 265---------------------------------------------------------------- 266# ... hack hack hack ... 267$ git add --patch foo # add just first part to the index 268$ git stash push --keep-index # save all other changes to the stash 269$ edit/build/test first part 270$ git commit -m 'First part' # commit fully tested change 271$ git stash pop # prepare to work on all other changes 272# ... repeat above five steps until one commit remains ... 273$ edit/build/test remaining parts 274$ git commit foo -m 'Remaining parts' 275---------------------------------------------------------------- 276 277Recovering stash entries that were cleared/dropped erroneously:: 278 279If you mistakenly drop or clear stash entries, they cannot be recovered 280through the normal safety mechanisms. However, you can try the 281following incantation to get a list of stash entries that are still in 282your repository, but not reachable any more: 283+ 284---------------------------------------------------------------- 285git fsck --unreachable | 286grep commit | cut -d\ -f3 | 287xargs git log --merges --no-walk --grep=WIP 288---------------------------------------------------------------- 289 290 291SEE ALSO 292-------- 293linkgit:git-checkout[1], 294linkgit:git-commit[1], 295linkgit:git-reflog[1], 296linkgit:git-reset[1], 297linkgit:git-switch[1] 298 299GIT 300--- 301Part of the linkgit:git[1] suite