はんなりと、ゆるやかに

アジャイル、スクラムが好きが日々から学んだことをアウトプット

変更を一時退避するGitコマンド:stash

開発中、最新の環境にしたくて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をクリックします。
f:id:iucstscui:20200511004636p:plain

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

スタッシュの変更内容を反映する

右クリックメニューからStash Popをクリックでスタッシュの内容をワーキングツリーに反映します。
f:id:iucstscui:20200511005256p:plain

まとめ

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