Git
git stash

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]

実行結果を見てみましょう。

git stash push -m run result

上から順に見ていきましょう。1.md ファイルに新しい変更を加えたので、git switch コマンドは中断されました。 Git は、switch する場合は commit するか stash するかをアドバイスしてくれます。

作業ツリーをクリアして git switch コマンドを実行できるようになります。

push コマンドは、-u オプションで追跡されていないファイル、-a オプションで無視されたファイルなど、どんなファイルでもスタッシュすることができます。 以下のように、プッシュするファイル名やディレクトリ名を指定することもできます。

git stash push filename

上の例とは異なり、-m オプションでメッセージを指定していないので、Git がコミット ID を含むメッセージを生成していることがわかります。

3. list コマンドによる隠し場所リストの取得

先ほどの例で簡単に説明したように、list コマンドは保存したスタッシュの一覧を表示します。 すべてのブランチで作成されたスタッシュが一覧表示され、より新しいものから順に 0 に近い番号で表示されます。

このコマンドは次のように使います。

$ git stash list

mainブランチとdevelopブランチの2つのスタッシュを作成し、listコマンドを実行してみましょう。

git stash 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 コマンドを実行します。

git stash show example finished

次に show コマンドを実行します。

git stash show 実行結果

上で示したように、-p オプションをつけるかどうかで出力が異なります。

5. apply コマンドによる隠し場所の復元

pushコマンドでスタッシュを保存して完了したら、変更を元に戻す必要があります。 これを行うには apply コマンドと pop コマンドを使います。

このうち、applyコマンドは保存したスタッシュを元に戻した後に、保存したスタッシュが削除されないようにするコマンドです。

コマンドは以下のようになります。 もし [stash-number] を指定しなければ、自動的に最新のstashである0番に対して実行されます。

$ git stash apply [stash-number]

実行結果を表示してみましょう。

git stash apply 実行結果

for stash メッセージで stash を保存した後、それを apply コマンドでインポートしました。apply コマンドは git status コマンドを実行し、作業コピーの現在のステータスを表示します。 を実行すると、作業ツリーの現在のステータスが表示されます。

apply コマンドの後に stash list をチェックすると、リストアした stash がまだ残っていることがわかります。

6. pop コマンドによる復元後のスタッシュの削除

pop コマンドも apply コマンドと同様に、キャッシュされた変更を取り消すために使用します。

コマンドは以下の通りで、ここでも[stash-number]を指定しないと、自動的に最新のstash、番号0に対して実行されます。

$ git stash drop [stash-number]

実行すると、次のようになります。

git stash pop 実行結果

もう一度、stash 用のメッセージとともに stash をプッシュしました。次に pop コマンドを使って変更を元に戻したところ、apply コマンドを使ったときと同じ出力が得られました。

唯一の違いは、スタッシュが削除され、スタッシュリストに表示されなくなったことです。

7. drop コマンドまたは clear コマンドを使用して変更を適用せずにスタッシュを削除する

drop コマンドは特定のスタッシュの変更を作業ツリーに適用せずに削除します。

[stash-number]が指定されない限り、自動的に最新のstashである番号 0 を対象とします。

$ git stash drop [stash-number]

popコマンドの結果を見てみましょう。

git stash drop 実行結果

for stash メッセージにある 0 番の stash が削除されていることがわかります。

もしstashリストにあるすべてのstashが不要になり、削除したいのであれば、clearコマンドを使って削除することができます。

コマンドは以下のようになります。

$ git 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]

そして、次のように実行します。

git stash ブランチの実行結果

9. 最後に

Git のコマンドの多くはコミットした状態で実行されるので、git stash コマンドは私が毎日使うコマンドのひとつです。 この記事が、あなたの日々の開発の生産性向上に役立つことを願っています。

copyright for git stash

© 2023 All rights reserved.