前フリ
みなさんは git stash
をつかっていますか?
簡単に説明しますと、まだ commit や add はしていない作業中の変更内容を退避しておける、というコマンドです。
git stash についてのわかりやすい説明はこちら
【git stash】コミットはせずに変更を退避したいとき - Qiita
ありがちなのはこんな場合です。
- 作業中に急な対応等で別の作業ブランチに移動したい
- しかし、やりかけの作業が邪魔をしてブランチの移動ができない
- まだ中途半端な状態だからコミットはしたくない
こんなときに git stash
を実行すると、作業中の変更をそのまま退避してくれます。なので、別ブランチの用件を片付けて、また元の作業ブランチに戻り、退避していた変更を元に戻すと、当初の状態に戻ってこれる、というものです。
問題点
そんな便利な git stash
なんですが、1つ困った点があります。
退避した変更を元に戻し忘れることがあります。
git stash
を実行すると、git status
の状態が nothing to commit, working tree clean
になります。要は変更中のファイルは何もないときと同じ表示です。こうなると何が困るかというと git stash
を実行していたことを忘れてしまう ということが起こります。
さすがに git stash
直後は覚えているんですが、別のブランチに移動したり、そっちの作業に追われたりして、さらに間が空いてしまうとけっこう忘れます。
解決案
忘れてしまう最大の原因は git stash してもしなくても見た目上の区別が全くつかない ことではないかと思います。ならば、見た目でわかるようにすれば解決できるのでは?と考えました。
というわけで、少々前置きが長くなりましたが今日は git stashしたら画面にそれを表示させて変更の戻し忘れを防止する方法 を考案してみましたのでご紹介いたします。
動作確認済み環境
- git version 2.23.0
- git version 2.11.0.windows.3
Windows は GitBash で確認しています。
導入手順
githooks を使います。
これを使うと、Git の特定の操作をトリガーにしたスクリプトの実行を行うことができます。
今回のケースでは git checkout
をトリガーに動作するスクリプト を作ってみます。というのも、git stash していることを通知してほしいタイミングとして、ブランチを移動した直後 に stash があることを画面に出してくれれば忘れにくいと思ったことが理由です。
ということで、git checkout
をトリガーとしたスクリプトを作り、スクリプトは stash の有無を画面に表示する動作を担当する というのをゴールとしてみます。
post-checkout
という、git checkout 直後に動作してくれるというまさにおあつらえ向きなフックが用意されていましたw遠慮なくこちらを使うことにします。
post-checkout 作成
開発中のリポジトリ直下まで移動したら以下の手順で .git/hooks
配下に post-checkout
ファイルを作成します。拡張子はいりません。
# 新規作成
touch .git/hooks/post-checkout
# 実行権限を付与(755じゃなくても実行さえできればなんでもよい)
chmod 755 .git/hooks/post-checkout
フックの中身を実装
stash の有無を確認して結果を出力するスクリプトを実装します。さきほど作成した post-checkout
ファイルを以下のように編集してください。
#!/bin/bash
STASH_LIST=$(git stash list)
if [ -n "$STASH_LIST" ]; then
echo ''
echo -e "\033[1;31;239m`echo $STASH_LIST | wc -l | xargs echo` stashed works found.\033[0m"
echo -e 'Please exec \033[1m`git stash list`\033[0m command to check the stashed works detail.'
fi
以上で準備は完了です。
使用例
あとは stash があるとき、ないときで、git checkout
実行時に以下のように見た目が変わります。ないときは今までと特に何も変わりません。stash があるときはその個数も表示させています。
stash が何もないとき
stash があるとき
感想
git hooks のおかげでやりたいことが意外とすんなり実現できました。
これだけでもけっこう stash の戻し忘れは減るんじゃないかとおもいます。もし気になった方はぜひ試してみてください。