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

gitGit

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

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

PR

git stashとは?

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

どんなときに使うのか

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

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

PR

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

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 liststashの一覧を確認する
git stash apply stash@{n}stashのn番目を現在のブランチに適用する
git stash popstashの最新を現在のブランチに適用して、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の解説がとてもわかりやすかったです!ありがとうございます!感謝です。

Ads Blocker Image Powered by Code Help Pro

広告ブロッカーが検出されました。

ブラウザの拡張機能を使用して広告ブロックをしていることが確認できました。 ブラウザの広告ブロッカー機能を無効にしていただくか、codelikes.comをホワイトリストに追加し、更新をクリックしてください。 お手数ですが、よろしくお願いします🙇‍♂️
タイトルとURLをコピーしました