開発中、最新の環境にしたくてPullしたとき、競合することはありませんか。または急ぎで別の開発を頼まれて今の変更をコミットせずにおいておきたいことはありませんか。
そんな時に使えるコマンドがgit stashです。git stashは現在の変更点を一時領域に退避(スタッシュ)できます。
git-scm.com
今回の検証に使ったgit version は 2.26.2 です。
変更を退避する
git stashコマンドはHEADとの差分がスタッシュされます。スタッシュされるファイルはオプションによって変わります。以下のフォルダ構成でオプションによる違いを確認していきます。
root/
├ commit.txt
├ change.txt
├ new.txt
└ ignore.txt
commit.txtは追跡されているファイルです。
change.txtは追跡されているファイル+変更ありのファイルです。
new.txtは追跡されていないファイルです(開発中で新しく作ったファイルの想定)。
ignore.txtは.gitignoreで無視ファイルに設定しています。
git stash
スタッシュされるファイルはHEADと差分がある追跡されているファイルです。上記のフォルダ構成の場合、以下のファイルがスタッシュされます。
- change.txt
git stash -a
スタッシュされるファイルはHEADと差分があるすべてのファイルです。上記のフォルダ構成の場合、以下のファイルがスタッシュされます。
- change.txt
- new.txt
- ignore.txt
git stash -u
スタッシュされるファイルはHEADと差分がある無視ファイル以外のファイルです。上記のフォルダ構成の場合、以下のファイルがスタッシュされます。
- change.txt
- new.txt
git stash -k
スタッシュされるファイルはHEADと差分があるファイルです。ただし、ステージングエリアに登録しているファイルの変更は残ったままです。上記のフォルダ構成の場合、以下のファイルがスタッシュされます。
- change.txt
スタッシュの一覧を確認する
git stash listコマンドでスタッシュの一覧が表示されます。
stash@{0}: On master: option-all
stash@{1}: On master: option-non
git stashコマンドで-m <コメント>オプションをつけてコメント付きでスタッシュすると一覧表示したさいにわかりやすくなります。
スタッシュの変更内容を表示する
git stash showコマンドでスタッシュしたさいの変更内容が表示されます。
change.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
スタッシュの変更内容を反映する
git stash popコマンドでスタッシュの内容をワーキングツリーに反映します。また、反映後はスタッシュから削除します。
git stash applyコマンドでスタッシュの内容をワーキングツリーに反映しますが、反映後にスタッシュから削除しません。
スタッシュを削除する
git stash clearコマンドですべてのスタッシュを削除します。
git stash drop コマンドで1つのスタッシュを削除します。
TortoiseGitで使う
TortoiseGitでもgit stashが使えます。基本はCUIと同じで、操作がGUIになるだけです。
変更を退避する
右クリックメニューからStash changesをクリックします。

ポップアップにメッセージや、オプションを選択してOKをクリックでスタッシュします。

スタッシュの変更内容を反映する
右クリックメニューからStash Popをクリックでスタッシュの内容をワーキングツリーに反映します。

まとめ
変更を一時退避するgit stashコマンドを調べました。過去にスタッシュしたのになぜかファイルが退避されてないということがあったのですが、オプションの指定ができてなかったんだと気づきました。知っているつもりのコマンドも改めて調べることは大切ですね。