[Git]変更を一時的に退避するgit stashの使い方イロハ

# git stash

[git stashコマンド](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E4%BD%9C%E6%A5%AD%E3%82%92%E9%9A%A0%E3%81%99)は、一時的に変更を退避するために使われます。

実際には以下のように使われます。

```bash
$ git status # 差分を見る
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash # 変更を退避
Saved working directory and index state WIP on master: 21ac30e Update sample scripts
HEAD is now at 21ac30e xxxxxxxxxxxxxxxxxxxxx

$ git status # 確認
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

$ git stash list # 退避されている変更を確認
stash@{0}: WIP on master: 21ac30e xxxxxxxxxxxxxxxxxxxxx

$ git stash pop # 取り出し
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (0ab136bef6df794fa9aff6e9c2e3fadfddcef13a)
```

## サブコマンド
### git stash list

``git stash list``を用いると、保存されている変更分の一覧が確認できます。

```bash
$ git stash list
stash@{0}: WIP on master: 21ac30e xxxxxxxxxxxxxxxxxxxxx
```

### git stash apply

``git stash pop``では、保存した変更分を取り出して再び反映させた後、
保存されていた変更分は消えてしまいます。

``git stash apply``で取り出すと、変更分は削除されません。


```bash
$ git stash list
stash@{0}: WIP on master: 21ac30e xxxxxxxxxxxxxxxxxxxxx

$ git stash apply
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash list
stash@{0}: WIP on master: 21ac30e xxxxxxxxxxxxxxxxxxxxx
```

### git stash {pop|apply} stash@{x}

```
$ git stash apply stash@{1}
```
``git stash {pop|apply}``は、番号を指定すると、上述の``git stash list``で確認できるstash番号を参照して、保存されている作業を取り出すことができます。

### git stash save '任意の文字列'

例えば、普通に``git stash``を実行するのではなく、上のようにメッセージ付きで退避することが可能です。
このようにして保存した作業は、``git stash list``で以下のように確認できます。

```bash
$ git stash save '不要な関数の削除'
$ git stash list
stash@{0}: On dev: 不要な関数の削除
```

### git stash show stash@{x}

退避した変更分を取り出さずにstashの差分を確認することができます。

```bash
$ git stash show stash@{0}
 README.md | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
```

## ユースケース

### リモートの変更分をPullするときにローカルの変更を一時退避する

```bash
$ git pull                                                                                                                 Updating 21ac30e..397a42e
error: Your local changes to the following files would be overwritten by merge:
        README.md
Please, commit your changes or stash them before you can merge.
Aborting

$ git stash

$ git pull
Updating 21ac30e..397a42e
Fast-forward
 README.md | 8 ++++++++
 1 file changed, 8 insertions(+)

$ git stash pop
```



## まとめ
``git stash``はとても便利なコマンドなので、
適切に使う事ができれば開発の大きな助けになります。
サブコマンドを駆使することで``git stash``をもっと快適に使いつつ、
快適なGitライフを送りましょう！