RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Git入門】git stashで作業を便利に退避する

【Git入門】git stashで作業を便利に退避する

はじめに

こんにちは、tuq376sです。
今回はGitで管理しているディレクトリでの作業をちょこっと中断したい場合に便利なgit stashコマンドについて、 基本と便利なオプションの使い方を中心に紹介していきたいと思います。

Gitの使い方、git commitの取り消し方、git cloneを知りたい方は以下ブログもご一読ください
【超入門】初心者のためのGitとGitHubの使い方 - RAKUS Developers Blog | ラクス エンジニアブログ
【Git入門】git commitを取り消したい、元に戻す方法まとめ - RAKUS Developers Blog | ラクス エンジニアブログ
【Git入門】git cloneで既存リポジトリをクローンしよう! - RAKUS Developers Blog | ラクス エンジニアブログ

目次

git stashの基本的な使い方

まずは、基本的な操作から。

作業を退避する

現在の変更作業を退避するには以下のコマンドを使います。

git stash save

このコマンドにより、ワーキングとステージングにある作業を退避することができます。
save部分は省略しgit stashのみでも実行可能です。

退避した作業一覧を確認する

次に退避した作業の一覧を確認しましょう。

git stash list

実行すると、これまで退避したものを一覧で見ることができます。
並び順はgit logと同じように上に表示されるものほど新しいものです。

$ git stash list
stash@{0}: WIP on master: 36af2d1 added index.txt   # 一番最近退避された作業内容 
stash@{1}: WIP on master: f0d73fe added readme
stash@{2}: WIP on master: 3faa214 feat readme

退避した作業を戻す

では、退避した作業を戻していきましょう。
作業を戻すコマンドは以下の2つがあります。

git stash apply
git stash pop

どちらも実行することで退避した作業一覧の一番新しいものを戻すことができます。
applyであれば退避一覧から該当の作業を削除しませんが、popであれば戻した作業が退避一覧から削除されるという違いがあります。

また、applypopどちらのコマンドでも以下のように指定することでgit stash listで確認できる任意の退避作業を戻すことができます。

$ git stash list
stash@{0}: WIP on master: 36af2d1 added index.txt
stash@{1}: WIP on master: f0d73fe added readme

$ git stash pop stash@{1}   # 戻したい作業を指定
On branch master
(中略)
Dropped stash@{1} (aa9b3a02231103600f1e622beb30118b28b202d3)

$ git stash list
stash@{0}: WIP on master: 36af2d1 added index.txt

以上を覚えておけば、git stashコマンドは問題なく使うことはできるかと思います。
けれどもっと便利な使い方もありますので、次はそちらを紹介していきます。

git stashのいろいろな退避の仕方

名前を付けて退避する

git stash listで確認できる一覧は、ぱっと見でどの作業内容を保存したものかがわかりづらいです。
そこで、退避時に名前を付けて一覧をわかりやすくしてみたいと思います。

$ git stash save "test_stash"   # 名前を付けて作業を保存
Saved working directory and index state On master: test_stash

$ git stash list
stash@{0}: On master: test_stash    # 名前を付けて保存した作業
stash@{1}: WIP on master: f0d73fe added readme   # 名前を付けず保存した作業

上記のようにgit stash saveの後ろに名前を指定することで、一覧から参照することができます。
ただし、名前を指定する場合はsaveを省略できないことに注意です。

ステージングを維持したまま退避する

git stashを実行するとワーキングとステージングにある作業を退避することができますが、
そのまま作業を戻すと、ステージングにあった変更もワーキングに戻ってしまいます。
ステージング状態を維持したままにするためには、戻す際にオプションを指定します。

git stash pop --index

もちろんapplyでも同じようにステージングの状態を維持することができます。

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   readme.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.txt

$ git stash
$ git stash apply --index   # ステージングを維持したまま作業を戻す
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   readme.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.txt

追跡されていないファイルの退避する

追跡されていない状態のものについてはgit stashの実行では退避されません。
新規作成したファイル等の追跡されていないものも含めて退避するには、以下のようにオプションを指定する必要があります。

git stash -u

退避した追跡されていないファイルは、戻すと再び追跡されていないファイルとなります。

$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.txt
nothing added to commit but untracked files present (use "git add" to track)

$ git stash -u   # 追跡されていないファイルを含めて退避
Saved working directory and index state WIP on master: f0d73fe added readme

$ git status   # 追跡されていないファイルも退避されている
On branch public_batch_data_acquisition
nothing to commit, working tree clean

$ git stash pop
(中略)
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.txt
nothing added to commit but untracked files present (use "git add" to track)

退避した作業の確認

退避した作業の一覧はgit stash listで確認することはできますが、各作業の詳細を確認するには以下のコマンドを用います。

git stash show [確認したい作業]

明示的に指定がなければ最新のものについて、指定があればその作業の詳細を確認できます。

$ git stash list
stash@{0}: WIP on master: 36af2d1 added index.txt
stash@{1}: WIP on master: f0d73fe added readme

$ git stash show   # stash@{0}の詳細を表示
index.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

$ git stash show stash@{1}   # stash@{1}の詳細を表示
readme.md | 6 +++---
1 file changed, 3 insertion(+), 3 deletion(-)

また、diffコマンドのように確認したい場合は以下のオプションを付与します。

git stash show -p [確認したい作業]

退避した作業の削除

一時的な作業退避と言っても、退避した作業が最終的に不要になったりすることもあるかと思います。
そのような場合もコマンドで退避した作業の削除が可能です。

まず、一覧にあるものすべてを削除したい場合は以下を指定します。

git stash clear

そして、一覧から1件ずつ削除したい場合は、以下のコマンドから行えます。

git stash drop [削除したい作業]

削除したい作業を指定しない場合は一番新しいものが削除されます。

$ git stash list
stash@{0}: WIP on master: 36af2d1 added index.txt
stash@{1}: WIP on master: f0d73fe added readme
stash@{2}: WIP on master: 3faa214 feat readme

$ git stash drop stash@{2}   # 作業を指定して削除
Dropped stash@{2} (af801de83b4f3f5ad60b11faa8a77021d962f18d)

$ git stash list
stash@{0}: WIP on master: 36af2d1 added index.txt
stash@{1}: WIP on master: f0d73fe added readme

$ git stash drop   # 作業を指定せず削除
Dropped refs/stash@{0} (4ce005a5c0489fc31008e28b6f64ebcd3d008f52)

$ git stash list
stash@{0}: WIP on master: f0d73fe added readme

おわりに

Gitの操作は日常的に行うものの、なんだかんだと自分は基本的な使い方しかしていないので、
今回はもう少し便利な使い方を覚えようと、git stashに焦点を当ててみました。
読んでいただいた方に1つでも、へぇと思っていただけるものがあれば幸いです。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.