git stash コマンド: 保存、ドロップ、ポップ、キャンセル、リスト、適用
この記事のテーマは git stash
コマンドです。git add や git commit よりも使う機会が多い便利なコマンドなので、ぜひ覚えて開発の生産性を上げましょう。
1. git stash とは?
git stash
コマンドは、作業中の変更を一時的に保存します。
ブランチの変更など、現在の変更をコミットして作業ツリーがクリーンアップされたときにのみ実行できるコマンドがあるからです。
このような場合、git stash
を使って一時的に作業状態を保存しておけば、一連のコマンドを処理して戻って作業を続けることができます。
git stash
コマンドを実行すると、Git は現在ステージされていない変更とステージされている変更 (インデックス) をすべて集めて新しい stash オブジェクトに保存します。
そして、それらを一時的に stash
という別の場所に保存します。
stash を実行すると、現在のブランチは最後にコミットした状態になります。この状態では、ほとんどすべての Git コマンドを自由に使うことができます。
それでは、git stash
コマンドのさまざまな使い方を、実際の例を見ながら見ていきましょう。
2. push コマンドを使った新しいスタッシュの作成
push
コマンドは git stash
の始まりです。現在の変更内容を保存し、必要であればこの stash を区別するためのメッセージを別途入力することもできます。
今までは git stash save
コマンドを使用していましたが、新しい git stash push
コマンドが追加され、多くの機能が追加されました。
そこで、これからは push
コマンドを使うことにします。
push
で追加された主な機能は、追跡されていないファイルやすべてのファイル、特定のファイルやディレクトリに対して stash を実行できるようになったことです。
次のように使用する。
$ git stash push -m [message]
実行結果を見てみましょう。
上から順に見ていきましょう。1.md
ファイルに新しい変更を加えたので、git switch
コマンドは中断されました。
Git は、switch する場合は commit するか stash するかをアドバイスしてくれます。
作業ツリーをクリアして git switch
コマンドを実行できるようになります。
push
コマンドは、-u
オプションで追跡されていないファイル、-a
オプションで無視されたファイルなど、どんなファイルでもスタッシュすることができます。
以下のように、プッシュするファイル名やディレクトリ名を指定することもできます。
上の例とは異なり、-m
オプションでメッセージを指定していないので、Git がコミット ID を含むメッセージを生成していることがわかります。
3. list コマンドによる隠し場所リストの取得
先ほどの例で簡単に説明したように、list
コマンドは保存したスタッシュの一覧を表示します。
すべてのブランチで作成されたスタッシュが一覧表示され、より新しいものから順に 0
に近い番号で表示されます。
このコマンドは次のように使います。
$ git stash list
main
ブランチとdevelop
ブランチの2つのスタッシュを作成し、list
コマンドを実行してみましょう。
git stash list
コマンドを実行すると、合計で 3 つの stash リストが表示されました。
メッセージなしで develop
ブランチから 2 つの stash を保存したので、このリストを見ただけでは何が変更されたのかを判断することはできません。
このような場合のために push
コマンドの -m
オプションを忘れないでください。
4. show -p コマンドで隠した内容を見る
先ほどの例のように、隠し場所のリストだけを見ていると、それぞれの隠し場所にどのような変更が保存されているのかわからないかもしれません。
そこで便利なのが show -p
コマンドです。
show
コマンドは単に隠し場所に保存されている変更のファイル名と変更された行数を教えてくれます。
-p
オプションをつけると、git diff
コマンドを実行してファイル内の変更点をより詳細に見ることができます。
コマンドは以下のようになります。 もし [stash-number]
を入力しなかった場合は、自動的に最新の stash である 0
番に対して実行されます。
$ git stash show -p [stash-number]
実行結果を見るには、2.md
ファイルに新しい内容を追加して push
コマンドを実行します。
次に show
コマンドを実行します。
上で示したように、-p
オプションをつけるかどうかで出力が異なります。
5. apply コマンドによる隠し場所の復元
push
コマンドでスタッシュを保存して完了したら、変更を元に戻す必要があります。
これを行うには apply
コマンドと pop
コマンドを使います。
このうち、apply
コマンドは保存したスタッシュを元に戻した後に、保存したスタッシュが削除されないようにするコマンドです。
コマンドは以下のようになります。 もし [stash-number]
を指定しなければ、自動的に最新のstashである0番に対して実行されます。
$ git stash apply [stash-number]
実行結果を表示してみましょう。
for stash
メッセージで stash を保存した後、それを apply
コマンドでインポートしました。apply
コマンドは git status
コマンドを実行し、作業コピーの現在のステータスを表示します。
を実行すると、作業ツリーの現在のステータスが表示されます。
apply
コマンドの後に stash list をチェックすると、リストアした stash がまだ残っていることがわかります。
6. pop
コマンドによる復元後のスタッシュの削除
pop
コマンドも apply
コマンドと同様に、キャッシュされた変更を取り消すために使用します。
コマンドは以下の通りで、ここでも[stash-number]
を指定しないと、自動的に最新のstash、番号0
に対して実行されます。
$ git stash drop [stash-number]
実行すると、次のようになります。
もう一度、stash 用のメッセージとともに stash をプッシュしました。次に pop
コマンドを使って変更を元に戻したところ、apply
コマンドを使ったときと同じ出力が得られました。
唯一の違いは、スタッシュが削除され、スタッシュリストに表示されなくなったことです。
7. drop
コマンドまたは clear
コマンドを使用して変更を適用せずにスタッシュを削除する
drop
コマンドは特定のスタッシュの変更を作業ツリーに適用せずに削除します。
[stash-number]
が指定されない限り、自動的に最新のstashである番号 0
を対象とします。
$ git stash drop [stash-number]
pop
コマンドの結果を見てみましょう。
for stash
メッセージにある 0 番の stash が削除されていることがわかります。
もしstashリストにあるすべてのstashが不要になり、削除したいのであれば、clear
コマンドを使って削除することができます。
コマンドは以下のようになります。
$ git stash clear
次のように実行するだけです。
clear
コマンドを実行すると、すべてのスタッシュリストが削除されました。
8. stash branch コマンドを使って現在の変更を新しいブランチに移動する方法
現在のブランチで作業しているすべての変更を新しいブランチに移動し、そこで作業する必要があることがあります。
これには、git add コマンド と git checkout/git switch コマンド を組み合わせます。
しかし、git stash branch
コマンドを使えば、この作業を1つのコマンドで行うことができます。
以下のコマンドを使います。[stash-number]
を指定しなければ、自動的に最新のstashである番号 0
に対して実行されます。
$ git stash branch [new-branch-name] [stash-number]
そして、次のように実行します。
9. 最後に
Git のコマンドの多くはコミットした状態で実行されるので、git stash
コマンドは私が毎日使うコマンドのひとつです。
この記事が、あなたの日々の開発の生産性向上に役立つことを願っています。
