Git入門:バージョン管理のきほん
作業を一時退避する(stash)
この回でやること
書きかけの変更をコミットせずに一時退避する git stash を学びます。退避・復元・一覧の使い分けと、pop と apply の違い、新規ファイルが退避されない落とし穴まで確認しましょう。
- 読む 約 8 分
書きかけのまま、別のブランチへ移れない
ログイン画面を直している途中に、本番でバグが出たので今すぐ直してほしい、と連絡が入る。手元は書きかけで、まだコミットできる形ではありません。
このまま別のブランチへ移ろうとすると、Git が止めます。
プレーンテキスト
error: Your local changes to the following files would be overwritten by checkout:
src/login.js
Please commit your changes or stash them before you switch branches.最後に commit your changes or stash them と書かれています。無理にコミットすると「作業中」という意味のない記録が履歴に残り、かといって捨てるわけにもいきません。そのための道具が git stash です。
棚に上げて、戻ってきたら降ろす
git stash は、書きかけの変更をまとめて棚に上げ、手元を最後のコミットの状態に戻します。机に広げた書きかけの書類を、いったん引き出しにしまう操作です。
ターミナル
$ git stash -u
Saved working directory and index state WIP on feature/login: 8f3c1a2 add login form
$ git status
On branch feature/login
nothing to commit, working tree clean変更が消えたように見えますが、.git の中にコミットとよく似た形で保存されています。これで安心して別のブランチへ移れます。
急ぎの修正を終えて戻ってきたら、引き出しから取り出します。
ターミナル
$ git stash pop
Changes not staged for commit:
modified: src/login.js
Dropped refs/stash@{0} (b9d2f7e6a1c4d8905f3b2e7a6c1d4098f5b3e2a7)書きかけが戻りました。Dropped は、棚から降ろして棚の記録も消した、という報告です。
棚は何段でも積めて、git stash list で一覧できます。同じ見出しが 5 つ並ぶと区別が付かないので、git stash -u -m "説明" の形で一言添えて上げる習慣にしておくと助かります。
pop の代わりに apply を使うと、降ろしても棚に残ります。同じ変更を複数のブランチに当てたいときだけ使い、済んだら git stash drop で消します。
新しく作ったファイルは、棚に乗らない
初めて使う人がほぼ全員はまるのがこれです。git stash は、既定では Git が追跡しているファイルの変更しか上げません。一度も git add していない新しいファイルは、手元に取り残されます。
そのまま別のブランチへ移ると、そのブランチに知らないファイルが紛れて見えます。ビルドが通らない、テストが落ちるといった、原因の分かりにくい混乱のもとです。
さきほどから付けている -u が、この対策です。未追跡のファイルも一緒に上げてくれます。迷ったら付けておけば安全です。
もう 1 つ、棚に上げたことを忘れたまま同じファイルを触り直すと、降ろすときに同じ行の直し方が 2 通りぶつかります。
プレーンテキスト
CONFLICT (content): Merge conflict in src/login.js
The stash entry is kept in case you need it again.最後の 1 行が大事です。ぶつかったときの pop は、棚の記録を消しません。ファイルを直して動作を確かめてから git stash drop してください。順番を逆にすると、直しかけの状態しか残らなくなります。
棚は一時置き場です。日をまたぐ作業を置くと、一覧を開かないかぎり目に入らないので、そのまま忘れられます。区切りが付かない作業は、素直に作業用のブランチを切ってコミットしてください。
git stashは書きかけをまとめて退避し、手元を最後のコミットの状態に戻す- 戻すのは
pop(降ろして消す)かapply(降ろして残す)。普段はpopでよい - 新しく作ったファイルは既定では乗らない。
-uを付ける習慣にすると事故が減る