git stashの使い方!作業をコミットせず一時保存する方法!

git Git

gitコマンドのgit stashの使い方について書いています。
最初にgit stashについて解説して、その後に実際にコマンドを使用してどうなるのかなど、詳細に書いてみました。

最後に紹介したコマンドを見やすいように表にまとめてみました。
Gitのバージョン2.32.0を使って、動作を確認しています。

git stashとは?

git stashコマンドを使用すると、gitで管理しているファイルを編集していた場合に、コミットせずに保存することが可能です。
保存したファイルは好きなときに、現在使用中のブランチに適用できます。

どんなときに使うのか

ブランチで作業中のときに、他の作業が入ってブランチを移動しないといけないので、保存しておきたいときや
ローカルで設定ファイルを変更していて、commitはしたくないけど、保存しておきたいときに使用します。

次項で、実際に保存や適用する方法を確認してみましょう。
git stashコマンドを使用して、動作を確認していきます。

ファイルの変更を保存する

git stashコマンドをオプションをつけずに使用すると、ファイルの変更がstashに保存されます。
下記のように使用します。

$ git stash

pushをつけることでも、同じように保存されます。
(※以前はsaveでしたが、非推奨になったようです。)

$ git stash push

実際に使用してみます。
git statusコマンドで状況を確認すると、現在は下記のようにmain.jsを修正している状態です。

$ git status 
On branch newBranch
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:   main.js

この状態で、git stashコマンドを使用すると、下記のように保存されます。

$ git stash
Saved working directory and index state WIP on newBranch: 72d856c add new.js file

これで、現在変更中のファイルがない状態になり、stashに変更中だったファイルが保持されます。
git statusコマンドで状態を確認すると、何も変更がない状態になりました。

$ git status
On branch newBranch
nothing to commit, working tree clean

保存したstashは「WIP on <ブランチ名>」で保存されます。

メッセージをつけて、ファイルの変更を保存する

stashにメッセージをつけて、変更したファイルを保存することができます。
git stashで-mオプションの後に、メッセージを渡します。

$ git stash -m "保存時メッセージ"

git stash pushで-mオプションをつけることでも、同じようにメッセージ付きで保存できます。

$ git stash push -m "保存時メッセージ"

実際にメッセージをつけて保存してみます。new.js・test.jsの2つのファイルを編集した状態です。
実行すると、下記のように保存されます。

$ git stash -m "change new.js and test.js"
Saved working directory and index state On newBranch: change new.js and test.js

保存したstashの一覧を確認する

git stash listを使用すると、保存されたstashを一覧で確認することが可能です。
下記のコマンドを実行します。

$ git stash list

そうすると、このように保存されたstashが確認できます。

$ git stash list      
stash@{0}: On newBranch: change new.js and test.js
stash@{1}: WIP on newBranch: 72d856c add new.js file

保存されたstashはメッセージなしで保存したものと、メッセージをつけて保存したものの2つです。
それぞれ「stash@{0}」と「stash@{1}」でアクセスできます。(作業内容の適用やstashの削除などで、この番号を使用します)

新しいstashが0番目で、メッセージなしで保存した方は1番目のものです。
0番目が最新になって、先に入れてたものは、番号がひとつずつずれていきます。

保存したstashの内容をブランチに適用する

一覧から指定したstashを適用するには、下記のようにgit stash applyコマンドを実行します。

$ git stash apply stash@{0}

これで、現在作業しているブランチに対して、保存していたstash@{0}を適用することができます。
git stash applyを使用すると、適用したstashの内容は残ったままになります。

実際にコマンドを使用して適用すると、下記のように適用されたファイルが表示されました。

% git stash apply stash@{1}
On branch newBranch
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:   new.js
        modified:   test.js

最新のstashを適用後に削除する

git stash popを使うと、保存した作業を適用した後に、stashから削除することができます。
このように実行すると、最新の作業(最後に保存したもの)が適用されて、削除されます。

$ git stash pop

指定したstashを適用後に削除する

指定したstashを適用後に削除するには、保存した番号を使用して、下記のように実行します。

$ git stash pop stash@{1}

実行すると「stash@{1}」が現在のブランチに適用されて、stashの一覧からは削除されます。

$ git stash pop stash@{1}
On branch newBranch
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:   new.js

no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{1} (9ee4848597635300e8b6b2d88afb8bbc2c0578e0)

上記のように適用されて、stash@{1}が消されたことが確認できました。

最新のstashを削除する

stashから最新のものを削除するにはgit stash dropを使用します。
そのまま使用すると、最新のstashが削除されます。作業内容は適用されません。

$ git stash drop

実行すると、下記のようにstash@{0}が消えたことが確認できました。

% git stash drop
Dropped refs/stash@{0} (8e21e35319972cd948d76a4fee6090aa2e7fb430)

指定したstashを削除する

stashの一覧から指定したものを削除するには、git stash dropに引数を渡します。
作業内容は適用されずにstash一覧から削除されます。

$ git stash drop stash@{2}

実行すると「stash@{2}」のstashが削除されます。

$ git stash drop stash@{2}
Dropped stash@{2} (680475df9b9a3c38d6b65fa5cd1df0511e43f15a)

このように削除されたstashが確認できます。

すべてのstashを削除する

git stash clearを実行すると、全てのstashが削除されます。

$ git stash clear

stashの内容を確認する

保存されたstashの内容を確認するには、git stash showを使用します。
何も指定しない場合は、最新の内容が確認できます。

$ git stash show

実行すると、下記のように編集した内容が表示されました。

$ git stash show stash@{1}
 new.js | 3 +++
 1 file changed, 3 insertions(+)

下記のようにstash番号を指定することにより、指定したstashの内容を確認することが可能です。

$ git stash show stash@{0}

stashから一部のファイルのみ適用する

一部のファイルのみを適用するには、checkoutコマンドを使用します。

$ git checkout <stashの番号> <ファイルパス>

実際に使用すると、下記のようにstashの内容が適用されます。

$ git checkout stash@{1} new.js
Updated 1 path from 1e04b7b

git stashコマンドのまとめ

最後に今回紹介したgit stashコマンドをまとめて表にしてみました。

コマンド 内容
git stash 現在のファイル変更をstashに保存する
git stash push 上記と同様
git stash -m “message” メッセージをつけて、stashに保存する
git stash push -m “message” 上記と同様
git stash list stashの一覧を確認する
git stash apply stash@{n} stashのn番目を現在のブランチに適用する
git stash pop stashの最新を現在のブランチに適用して、stashを削除する
git stash pop stash@{n} stashのn番目を現在のブランチに適用して、stashを削除する
git stash drop 最新のstashを削除する
git stash drop stash@{n} n番目のstashを削除する
git stash clear 全てのstashを削除する
git stash show 最新のstashの内容を確認する
git stash show stash@{n} stashのn番目のstashの内容を確認する

コメント

  1. フロントエンドエンジニアの新人 より:

    git stashの解説がとてもわかりやすかったです!ありがとうございます!感謝です。

タイトルとURLをコピーしました