2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Git]stash の戻し忘れを git hooks で防止する

Last updated at Posted at 2020-02-13

前フリ

みなさんは 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 ファイルを以下のように編集してください。

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 が何もないとき

スクリーンショット 2020-02-14 8.46.39.png

stash があるとき

スクリーンショット 2020-02-14 8.47.41.png

感想

git hooks のおかげでやりたいことが意外とすんなり実現できました。
これだけでもけっこう stash の戻し忘れは減るんじゃないかとおもいます。もし気になった方はぜひ試してみてください。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?