しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 1 | git-stash(1) |
| 2 | ============ |
| 3 | |
| 4 | NAME |
| 5 | ---- |
| 6 | git-stash - Stash the changes in a dirty working directory away |
| 7 | |
| 8 | SYNOPSIS |
| 9 | -------- |
| 10 | [verse] |
Stephan Beyer | a5ab00c | 2008-08-16 05:27:31 +0200 | [diff] [blame] | 11 | 'git stash' list [<options>] |
Paul-Sebastian Ungureanu | bef55dc | 2019-02-25 23:16:14 +0000 | [diff] [blame] | 12 | 'git stash' show [<options>] [<stash>] |
Stephen Boyd | fcdd0e9 | 2009-06-17 18:07:37 -0700 | [diff] [blame] | 13 | 'git stash' drop [-q|--quiet] [<stash>] |
| 14 | 'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>] |
Abhijit Menon-Sen | 656b503 | 2008-07-03 11:46:05 +0530 | [diff] [blame] | 15 | 'git stash' branch <branchname> [<stash>] |
Thomas Gummerer | 1ada502 | 2017-02-28 20:33:39 +0000 | [diff] [blame] | 16 | 'git stash' [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] |
Thomas Gummerer | 0a790f0 | 2018-03-26 22:11:47 +0100 | [diff] [blame] | 17 | [-u|--include-untracked] [-a|--all] [-m|--message <message>] |
Alexandr Miloslavskiy | 8a98758 | 2020-02-17 17:25:22 +0000 | [diff] [blame] | 18 | [--pathspec-from-file=<file> [--pathspec-file-nul]] |
Thomas Gummerer | 1ada502 | 2017-02-28 20:33:39 +0000 | [diff] [blame] | 19 | [--] [<pathspec>...]] |
Abhijit Menon-Sen | 656b503 | 2008-07-03 11:46:05 +0530 | [diff] [blame] | 20 | 'git stash' clear |
Ramkumar Ramachandra | 2be4351 | 2013-06-15 18:43:22 +0530 | [diff] [blame] | 21 | 'git stash' create [<message>] |
Ramkumar Ramachandra | bd514ca | 2013-06-15 18:43:25 +0530 | [diff] [blame] | 22 | 'git stash' store [-m|--message <message>] [-q|--quiet] <commit> |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 23 | |
| 24 | DESCRIPTION |
| 25 | ----------- |
| 26 | |
Thomas Rast | ca76828 | 2010-01-07 17:49:12 +0100 | [diff] [blame] | 27 | Use `git stash` when you want to record the current state of the |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 28 | working directory and the index, but want to go back to a clean |
| 29 | working directory. The command saves your local modifications away |
| 30 | and reverts the working directory to match the `HEAD` commit. |
| 31 | |
| 32 | The modifications stashed away by this command can be listed with |
Jonathan Nieder | 483bc4f | 2008-06-30 13:56:34 -0500 | [diff] [blame] | 33 | `git stash list`, inspected with `git stash show`, and restored |
| 34 | (potentially on top of a different commit) with `git stash apply`. |
Thomas Gummerer | db37745 | 2017-10-22 18:04:07 +0100 | [diff] [blame] | 35 | Calling `git stash` without any arguments is equivalent to `git stash push`. |
Jonathan Nieder | 483bc4f | 2008-06-30 13:56:34 -0500 | [diff] [blame] | 36 | A stash is by default listed as "WIP on 'branchname' ...", but |
しらいしななこ | ec96e0f | 2007-07-17 17:15:42 +0900 | [diff] [blame] | 37 | you can give a more descriptive message on the command line when |
| 38 | you create one. |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 39 | |
Jeff King | cc1b8d8 | 2010-02-17 20:16:20 -0500 | [diff] [blame] | 40 | The latest stash you created is stored in `refs/stash`; older |
Junio C Hamano | 9488e87 | 2007-07-01 15:29:01 -0700 | [diff] [blame] | 41 | stashes are found in the reflog of this reference and can be named using |
Jeff King | 6cf378f | 2012-04-26 04:51:57 -0400 | [diff] [blame] | 42 | the usual reflog syntax (e.g. `stash@{0}` is the most recently |
| 43 | created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}` |
Aaron M Watson | a56c8f5 | 2016-10-24 19:40:13 -0400 | [diff] [blame] | 44 | is also possible). Stashes may also be referenced by specifying just the |
| 45 | stash index (e.g. the integer `n` is equivalent to `stash@{n}`). |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 46 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 47 | COMMANDS |
| 48 | -------- |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 49 | |
Alexandr Miloslavskiy | 8a98758 | 2020-02-17 17:25:22 +0000 | [diff] [blame] | 50 | push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]:: |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 51 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 52 | Save your local modifications to a new 'stash entry' and roll them |
Thomas Gummerer | 20a7e06 | 2017-02-12 21:54:14 +0000 | [diff] [blame] | 53 | back to HEAD (in the working tree and in the index). |
| 54 | The <message> part is optional and gives |
Thomas Gummerer | 9e14090 | 2017-02-28 20:33:40 +0000 | [diff] [blame] | 55 | the description along with the stashed state. |
| 56 | + |
| 57 | For quickly making a snapshot, you can omit "push". In this mode, |
| 58 | non-option arguments are not allowed to prevent a misspelled |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 59 | subcommand from making an unwanted stash entry. The two exceptions to this |
Alexandr Miloslavskiy | 3f3d806 | 2020-02-17 17:25:20 +0000 | [diff] [blame] | 60 | are `stash -p` which acts as alias for `stash push -p` and pathspec elements, |
Thomas Gummerer | 9e14090 | 2017-02-28 20:33:40 +0000 | [diff] [blame] | 61 | which are allowed after a double hyphen `--` for disambiguation. |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 62 | |
Thomas Gummerer | fd2ebf1 | 2017-10-22 18:04:08 +0100 | [diff] [blame] | 63 | save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]:: |
| 64 | |
| 65 | This option is deprecated in favour of 'git stash push'. It |
Alexandr Miloslavskiy | 3f3d806 | 2020-02-17 17:25:20 +0000 | [diff] [blame] | 66 | differs from "stash push" in that it cannot take pathspec. |
Johannes Schindelin | 57d8f4b | 2019-10-10 03:06:41 -0700 | [diff] [blame] | 67 | Instead, all non-option arguments are concatenated to form the stash |
| 68 | message. |
Thomas Gummerer | fd2ebf1 | 2017-10-22 18:04:08 +0100 | [diff] [blame] | 69 | |
Miklos Vajna | fbd538c | 2008-02-20 12:31:35 +0100 | [diff] [blame] | 70 | list [<options>]:: |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 71 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 72 | List the stash entries that you currently have. Each 'stash entry' is |
| 73 | listed with its name (e.g. `stash@{0}` is the latest entry, `stash@{1}` is |
Junio C Hamano | 9488e87 | 2007-07-01 15:29:01 -0700 | [diff] [blame] | 74 | the one before, etc.), the name of the branch that was current when the |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 75 | entry was made, and a short description of the commit the entry was |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 76 | based on. |
| 77 | + |
| 78 | ---------------------------------------------------------------- |
しらいしななこ | ec96e0f | 2007-07-17 17:15:42 +0900 | [diff] [blame] | 79 | stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation |
| 80 | stash@{1}: On master: 9cc0589... Add git-stash |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 81 | ---------------------------------------------------------------- |
Miklos Vajna | fbd538c | 2008-02-20 12:31:35 +0100 | [diff] [blame] | 82 | + |
Thomas Rast | 0b444cd | 2010-01-10 00:33:00 +0100 | [diff] [blame] | 83 | The command takes options applicable to the 'git log' |
Thomas Rast | b7b1038 | 2009-10-19 17:48:12 +0200 | [diff] [blame] | 84 | command to control what is shown and how. See linkgit:git-log[1]. |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 85 | |
Paul-Sebastian Ungureanu | bef55dc | 2019-02-25 23:16:14 +0000 | [diff] [blame] | 86 | show [<options>] [<stash>]:: |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 87 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 88 | Show the changes recorded in the stash entry as a diff between the |
| 89 | stashed contents and the commit back when the stash entry was first |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 90 | created. |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 91 | By default, the command shows the diffstat, but it will accept any |
| 92 | format known to 'git diff' (e.g., `git stash show -p stash@{1}` |
| 93 | to view the second most recent entry in patch form). |
Namhyung Kim | 3086c06 | 2015-08-30 00:25:57 +0900 | [diff] [blame] | 94 | You can use stash.showStat and/or stash.showPatch config variables |
| 95 | to change the default behavior. |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 96 | |
Stephen Boyd | fcdd0e9 | 2009-06-17 18:07:37 -0700 | [diff] [blame] | 97 | pop [--index] [-q|--quiet] [<stash>]:: |
Thomas Rast | d183663 | 2009-05-28 11:40:15 +0200 | [diff] [blame] | 98 | |
| 99 | Remove a single stashed state from the stash list and apply it |
| 100 | on top of the current working tree state, i.e., do the inverse |
Thomas Gummerer | db37745 | 2017-10-22 18:04:07 +0100 | [diff] [blame] | 101 | operation of `git stash push`. The working directory must |
Thomas Rast | d183663 | 2009-05-28 11:40:15 +0200 | [diff] [blame] | 102 | match the index. |
| 103 | + |
| 104 | Applying the state can fail with conflicts; in this case, it is not |
| 105 | removed from the stash list. You need to resolve the conflicts by hand |
| 106 | and call `git stash drop` manually afterwards. |
SZEDER Gábor | f39d6ee | 2009-06-09 00:57:06 +0200 | [diff] [blame] | 107 | |
Stephen Boyd | fcdd0e9 | 2009-06-17 18:07:37 -0700 | [diff] [blame] | 108 | apply [--index] [-q|--quiet] [<stash>]:: |
SZEDER Gábor | f39d6ee | 2009-06-09 00:57:06 +0200 | [diff] [blame] | 109 | |
Jon Seymour | b0c6bf4 | 2010-08-21 14:09:04 +1000 | [diff] [blame] | 110 | Like `pop`, but do not remove the state from the stash list. Unlike `pop`, |
| 111 | `<stash>` may be any commit that looks like a commit created by |
Thomas Gummerer | db37745 | 2017-10-22 18:04:07 +0100 | [diff] [blame] | 112 | `stash push` or `stash create`. |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 113 | |
Abhijit Menon-Sen | 656b503 | 2008-07-03 11:46:05 +0530 | [diff] [blame] | 114 | branch <branchname> [<stash>]:: |
| 115 | |
| 116 | Creates and checks out a new branch named `<branchname>` starting from |
| 117 | the commit at which the `<stash>` was originally created, applies the |
Jon Seymour | b0c6bf4 | 2010-08-21 14:09:04 +1000 | [diff] [blame] | 118 | changes recorded in `<stash>` to the new working tree and index. |
| 119 | If that succeeds, and `<stash>` is a reference of the form |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 120 | `stash@{<revision>}`, it then drops the `<stash>`. |
Abhijit Menon-Sen | 656b503 | 2008-07-03 11:46:05 +0530 | [diff] [blame] | 121 | + |
Thomas Gummerer | db37745 | 2017-10-22 18:04:07 +0100 | [diff] [blame] | 122 | This is useful if the branch on which you ran `git stash push` has |
Abhijit Menon-Sen | 656b503 | 2008-07-03 11:46:05 +0530 | [diff] [blame] | 123 | changed enough that `git stash apply` fails due to conflicts. Since |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 124 | the stash entry is applied on top of the commit that was HEAD at the |
| 125 | time `git stash` was run, it restores the originally stashed state |
| 126 | with no conflicts. |
Abhijit Menon-Sen | 656b503 | 2008-07-03 11:46:05 +0530 | [diff] [blame] | 127 | |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 128 | clear:: |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 129 | Remove all the stash entries. Note that those entries will then |
Thomas Rast | f5f1e16 | 2009-08-09 02:47:36 +0200 | [diff] [blame] | 130 | be subject to pruning, and may be impossible to recover (see |
| 131 | 'Examples' below for a possible strategy). |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 132 | |
Stephen Boyd | fcdd0e9 | 2009-06-17 18:07:37 -0700 | [diff] [blame] | 133 | drop [-q|--quiet] [<stash>]:: |
Brandon Casey | e25d5f9 | 2008-02-22 13:04:54 -0600 | [diff] [blame] | 134 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 135 | Remove a single stash entry from the list of stash entries. |
Brandon Casey | e25d5f9 | 2008-02-22 13:04:54 -0600 | [diff] [blame] | 136 | |
Stephan Beyer | a5ab00c | 2008-08-16 05:27:31 +0200 | [diff] [blame] | 137 | create:: |
| 138 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 139 | Create a stash entry (which is a regular commit object) and |
| 140 | return its object name, without storing it anywhere in the ref |
| 141 | namespace. |
Ramkumar Ramachandra | 2be4351 | 2013-06-15 18:43:22 +0530 | [diff] [blame] | 142 | This is intended to be useful for scripts. It is probably not |
Phil Hord | 0d5f844 | 2017-11-21 15:05:23 -0800 | [diff] [blame] | 143 | the command you want to use; see "push" above. |
Stephan Beyer | a5ab00c | 2008-08-16 05:27:31 +0200 | [diff] [blame] | 144 | |
Ramkumar Ramachandra | bd514ca | 2013-06-15 18:43:25 +0530 | [diff] [blame] | 145 | store:: |
| 146 | |
| 147 | Store a given stash created via 'git stash create' (which is a |
| 148 | dangling merge commit) in the stash ref, updating the stash |
| 149 | reflog. This is intended to be useful for scripts. It is |
Phil Hord | 0d5f844 | 2017-11-21 15:05:23 -0800 | [diff] [blame] | 150 | probably not the command you want to use; see "push" above. |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 151 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 152 | OPTIONS |
| 153 | ------- |
| 154 | -a:: |
| 155 | --all:: |
| 156 | This option is only valid for `push` and `save` commands. |
| 157 | + |
| 158 | All ignored and untracked files are also stashed and then cleaned |
| 159 | up with `git clean`. |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 160 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 161 | -u:: |
| 162 | --include-untracked:: |
| 163 | This option is only valid for `push` and `save` commands. |
| 164 | + |
| 165 | All untracked files are also stashed and then cleaned up with |
| 166 | `git clean`. |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 167 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 168 | --index:: |
| 169 | This option is only valid for `pop` and `apply` commands. |
| 170 | + |
| 171 | Tries to reinstate not only the working tree's changes, but also |
| 172 | the index's ones. However, this can fail, when you have conflicts |
| 173 | (which are stored in the index, where you therefore can no longer |
| 174 | apply the changes as they were originally). |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 175 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 176 | -k:: |
| 177 | --keep-index:: |
| 178 | --no-keep-index:: |
| 179 | This option is only valid for `push` and `save` commands. |
| 180 | + |
| 181 | All changes already added to the index are left intact. |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 182 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 183 | -p:: |
| 184 | --patch:: |
| 185 | This option is only valid for `push` and `save` commands. |
| 186 | + |
| 187 | Interactively select hunks from the diff between HEAD and the |
| 188 | working tree to be stashed. The stash entry is constructed such |
| 189 | that its index state is the same as the index state of your |
| 190 | repository, and its worktree contains only the changes you selected |
| 191 | interactively. The selected changes are then rolled back from your |
| 192 | worktree. See the ``Interactive Mode'' section of linkgit:git-add[1] |
| 193 | to learn how to operate the `--patch` mode. |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 194 | + |
| 195 | The `--patch` option implies `--keep-index`. You can use |
| 196 | `--no-keep-index` to override this. |
| 197 | |
Alexandr Miloslavskiy | 8a98758 | 2020-02-17 17:25:22 +0000 | [diff] [blame] | 198 | --pathspec-from-file=<file>:: |
| 199 | This option is only valid for `push` command. |
| 200 | + |
| 201 | Pathspec is passed in `<file>` instead of commandline args. If |
| 202 | `<file>` is exactly `-` then standard input is used. Pathspec |
| 203 | elements are separated by LF or CR/LF. Pathspec elements can be |
| 204 | quoted as explained for the configuration variable `core.quotePath` |
| 205 | (see linkgit:git-config[1]). See also `--pathspec-file-nul` and |
| 206 | global `--literal-pathspecs`. |
| 207 | |
| 208 | --pathspec-file-nul:: |
| 209 | This option is only valid for `push` command. |
| 210 | + |
| 211 | Only meaningful with `--pathspec-from-file`. Pathspec elements are |
| 212 | separated with NUL character and all other characters are taken |
| 213 | literally (including newlines and quotes). |
| 214 | |
Alexandr Miloslavskiy | b229091 | 2020-02-17 17:25:19 +0000 | [diff] [blame] | 215 | -q:: |
| 216 | --quiet:: |
| 217 | This option is only valid for `apply`, `drop`, `pop`, `push`, |
| 218 | `save`, `store` commands. |
| 219 | + |
| 220 | Quiet, suppress feedback messages. |
| 221 | |
| 222 | \--:: |
| 223 | This option is only valid for `push` command. |
| 224 | + |
| 225 | Separates pathspec from options for disambiguation purposes. |
| 226 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 227 | <pathspec>...:: |
| 228 | This option is only valid for `push` command. |
| 229 | + |
| 230 | The new stash entry records the modified states only for the files |
| 231 | that match the pathspec. The index entries and working tree files |
| 232 | are then rolled back to the state in HEAD only for these files, |
| 233 | too, leaving files that do not match the pathspec intact. |
Alexandr Miloslavskiy | 3f3d806 | 2020-02-17 17:25:20 +0000 | [diff] [blame] | 234 | + |
| 235 | For more details, see the 'pathspec' entry in linkgit:gitglossary[7]. |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 236 | |
Alexandr Miloslavskiy | 0093abc | 2020-02-17 17:25:18 +0000 | [diff] [blame] | 237 | <stash>:: |
| 238 | This option is only valid for `apply`, `branch`, `drop`, `pop`, |
| 239 | `show` commands. |
| 240 | + |
| 241 | A reference of the form `stash@{<revision>}`. When no `<stash>` is |
| 242 | given, the latest stash is assumed (that is, `stash@{0}`). |
Alexandr Miloslavskiy | 2b7460d | 2020-02-17 17:25:17 +0000 | [diff] [blame] | 243 | |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 244 | DISCUSSION |
| 245 | ---------- |
| 246 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 247 | A stash entry is represented as a commit whose tree records the state |
| 248 | of the working directory, and its first parent is the commit at `HEAD` |
| 249 | when the entry was created. The tree of the second parent records the |
| 250 | state of the index when the entry is made, and it is made a child of |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 251 | the `HEAD` commit. The ancestry graph looks like this: |
| 252 | |
| 253 | .----W |
| 254 | / / |
Junio C Hamano | 114fd81 | 2007-07-04 22:09:20 -0700 | [diff] [blame] | 255 | -----H----I |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 256 | |
| 257 | where `H` is the `HEAD` commit, `I` is a commit that records the state |
| 258 | of the index, and `W` is a commit that records the state of the working |
| 259 | tree. |
| 260 | |
| 261 | |
| 262 | EXAMPLES |
| 263 | -------- |
| 264 | |
| 265 | Pulling into a dirty tree:: |
| 266 | |
| 267 | When you are in the middle of something, you learn that there are |
Junio C Hamano | 9488e87 | 2007-07-01 15:29:01 -0700 | [diff] [blame] | 268 | upstream changes that are possibly relevant to what you are |
| 269 | doing. When your local changes do not conflict with the changes in |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 270 | the upstream, a simple `git pull` will let you move forward. |
| 271 | + |
| 272 | However, there are cases in which your local changes do conflict with |
| 273 | the upstream changes, and `git pull` refuses to overwrite your |
Junio C Hamano | 9488e87 | 2007-07-01 15:29:01 -0700 | [diff] [blame] | 274 | changes. In such a case, you can stash your changes away, |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 275 | perform a pull, and then unstash, like this: |
| 276 | + |
| 277 | ---------------------------------------------------------------- |
| 278 | $ git pull |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 279 | ... |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 280 | file foobar not up to date, cannot merge. |
| 281 | $ git stash |
| 282 | $ git pull |
Thomas Rast | d183663 | 2009-05-28 11:40:15 +0200 | [diff] [blame] | 283 | $ git stash pop |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 284 | ---------------------------------------------------------------- |
| 285 | |
| 286 | Interrupted workflow:: |
| 287 | |
| 288 | When you are in the middle of something, your boss comes in and |
Junio C Hamano | 9488e87 | 2007-07-01 15:29:01 -0700 | [diff] [blame] | 289 | demands that you fix something immediately. Traditionally, you would |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 290 | make a commit to a temporary branch to store your changes away, and |
Junio C Hamano | 9488e87 | 2007-07-01 15:29:01 -0700 | [diff] [blame] | 291 | return to your original branch to make the emergency fix, like this: |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 292 | + |
| 293 | ---------------------------------------------------------------- |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 294 | # ... hack hack hack ... |
Nguyễn Thái Ngọc Duy | 328c6cb | 2019-03-29 17:39:19 +0700 | [diff] [blame] | 295 | $ git switch -c my_wip |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 296 | $ git commit -a -m "WIP" |
Nguyễn Thái Ngọc Duy | 328c6cb | 2019-03-29 17:39:19 +0700 | [diff] [blame] | 297 | $ git switch master |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 298 | $ edit emergency fix |
| 299 | $ git commit -a -m "Fix in a hurry" |
Nguyễn Thái Ngọc Duy | 328c6cb | 2019-03-29 17:39:19 +0700 | [diff] [blame] | 300 | $ git switch my_wip |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 301 | $ git reset --soft HEAD^ |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 302 | # ... continue hacking ... |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 303 | ---------------------------------------------------------------- |
| 304 | + |
Thomas Rast | 0b444cd | 2010-01-10 00:33:00 +0100 | [diff] [blame] | 305 | You can use 'git stash' to simplify the above, like this: |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 306 | + |
| 307 | ---------------------------------------------------------------- |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 308 | # ... hack hack hack ... |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 309 | $ git stash |
| 310 | $ edit emergency fix |
| 311 | $ git commit -a -m "Fix in a hurry" |
Thomas Rast | d183663 | 2009-05-28 11:40:15 +0200 | [diff] [blame] | 312 | $ git stash pop |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 313 | # ... continue hacking ... |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 314 | ---------------------------------------------------------------- |
| 315 | |
SZEDER Gábor | 7bedebc | 2008-06-27 16:37:15 +0200 | [diff] [blame] | 316 | Testing partial commits:: |
| 317 | |
Thomas Gummerer | db37745 | 2017-10-22 18:04:07 +0100 | [diff] [blame] | 318 | You can use `git stash push --keep-index` when you want to make two or |
SZEDER Gábor | 7bedebc | 2008-06-27 16:37:15 +0200 | [diff] [blame] | 319 | more commits out of the changes in the work tree, and you want to test |
| 320 | each change before committing: |
| 321 | + |
| 322 | ---------------------------------------------------------------- |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 323 | # ... hack hack hack ... |
Eric Raible | caf1899 | 2008-07-08 00:40:56 -0700 | [diff] [blame] | 324 | $ git add --patch foo # add just first part to the index |
Thomas Gummerer | db37745 | 2017-10-22 18:04:07 +0100 | [diff] [blame] | 325 | $ git stash push --keep-index # save all other changes to the stash |
Eric Raible | caf1899 | 2008-07-08 00:40:56 -0700 | [diff] [blame] | 326 | $ edit/build/test first part |
SZEDER Gábor | f733c70 | 2008-09-02 03:45:01 +0200 | [diff] [blame] | 327 | $ git commit -m 'First part' # commit fully tested change |
Eric Raible | caf1899 | 2008-07-08 00:40:56 -0700 | [diff] [blame] | 328 | $ git stash pop # prepare to work on all other changes |
SZEDER Gábor | 9da6f0f | 2008-09-02 03:35:24 +0200 | [diff] [blame] | 329 | # ... repeat above five steps until one commit remains ... |
Eric Raible | caf1899 | 2008-07-08 00:40:56 -0700 | [diff] [blame] | 330 | $ edit/build/test remaining parts |
| 331 | $ git commit foo -m 'Remaining parts' |
SZEDER Gábor | 7bedebc | 2008-06-27 16:37:15 +0200 | [diff] [blame] | 332 | ---------------------------------------------------------------- |
| 333 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 334 | Recovering stash entries that were cleared/dropped erroneously:: |
Thomas Rast | f5f1e16 | 2009-08-09 02:47:36 +0200 | [diff] [blame] | 335 | |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 336 | If you mistakenly drop or clear stash entries, they cannot be recovered |
Thomas Rast | f5f1e16 | 2009-08-09 02:47:36 +0200 | [diff] [blame] | 337 | through the normal safety mechanisms. However, you can try the |
Liam Beguin | e01db91 | 2017-06-17 18:30:50 -0400 | [diff] [blame] | 338 | following incantation to get a list of stash entries that are still in |
| 339 | your repository, but not reachable any more: |
Thomas Rast | f5f1e16 | 2009-08-09 02:47:36 +0200 | [diff] [blame] | 340 | + |
| 341 | ---------------------------------------------------------------- |
| 342 | git fsck --unreachable | |
| 343 | grep commit | cut -d\ -f3 | |
| 344 | xargs git log --merges --no-walk --grep=WIP |
| 345 | ---------------------------------------------------------------- |
| 346 | |
| 347 | |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 348 | SEE ALSO |
| 349 | -------- |
Dan McGee | 5162e69 | 2007-12-29 00:20:38 -0600 | [diff] [blame] | 350 | linkgit:git-checkout[1], |
| 351 | linkgit:git-commit[1], |
| 352 | linkgit:git-reflog[1], |
Nguyễn Thái Ngọc Duy | 328c6cb | 2019-03-29 17:39:19 +0700 | [diff] [blame] | 353 | linkgit:git-reset[1], |
| 354 | linkgit:git-switch[1] |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 355 | |
しらいしななこ | 09ccdb6 | 2007-07-01 14:26:08 +0900 | [diff] [blame] | 356 | GIT |
| 357 | --- |
Christian Couder | 9e1f0a8 | 2008-06-06 09:07:32 +0200 | [diff] [blame] | 358 | Part of the linkgit:git[1] suite |