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の内容を確認する |
コメント
git stashの解説がとてもわかりやすかったです!ありがとうございます!感謝です。
コメントありがとうございます😄