はじめに
git pushでブランチ間違っちゃった!ってこと、たまにありますよね。
現在のブランチ確認したくないですか?
そんな時は、キムタクに「待て」をかけてもらいましょう。
git hooks
Gitに標準で搭載されている git hooks というソリューションを今回利用します。
※ 本記事では git hooks 自体の詳細な説明は割愛します。
Git フックは、Git でコマンドを実行する直前もしくは実行後に特定のスクリプトを実行するための仕組みです。
たとえば、pre-commit という Git フックを使用すると、git commit を実行する直前に任意のスクリプトを実行することができます。これを利用することで、コミットメッセージにイシューやチケットの番号が含まれていなかったらコミットを中止する、などの処理を行うことができるようになります。
上記の記事、わかりやすかったです。
プッシュ前の現在のブランチの確認操作を自動化する
本記事では、git hooks の pre-push フックを活用して「ちょ待てよ」を発動したいと思います。
pre-push フックについて
git push を実行した際、リモート参照が更新された後、オブジェクトの転送が始まる前に実行されます。 このフックはリモートの名前と場所を引数に取ります。また、これから更新する参照のリストを stdin から受け取ります。 このフックは、プッシュを行う前に、更新される参照を検査するのに使用できます(ゼロ以外の値を返すとプッシュが中断されます)。
作業手順
※ Global設定ではなく、リポジトリでの設定方法を提示させていただきます。
※ Global設定については、以下の記事を参照ください。
1. git 管理しているプロジェクトルートに移動
cd 等で移動してください。
2. .git/hooks を確認
findコマンドで確認すると、以下のファイルがあるはずです。
$ find .git/hooks
.git/hooks
.git/hooks/commit-msg.sample
.git/hooks/pre-rebase.sample
.git/hooks/sendemail-validate.sample
.git/hooks/pre-commit.sample
.git/hooks/applypatch-msg.sample
.git/hooks/fsmonitor-watchman.sample
.git/hooks/pre-receive.sample
.git/hooks/prepare-commit-msg.sample
.git/hooks/post-update.sample
.git/hooks/pre-merge-commit.sample
.git/hooks/pre-applypatch.sample
.git/hooks/pre-push.sample # 今回はこのファイルを使います。
.git/hooks/update.sample
.git/hooks/push-to-checkout.sample
3. ファイルのリネーム
sample 拡張子を外します。
mv .git/hooks/pre-push.sample .git/hooks/pre-push
4. スクリプト実装
#!/bin/sh
# 現在のブランチ名を取得
current_branch=$(git rev-parse --abbrev-ref HEAD)
echo >&2 "------------------------------------------------------------------------"
echo >&2 "ちょ待てよ。ブランチ (${current_branch}) をプッシュするよ? (y/n): "
echo >&2 "------------------------------------------------------------------------"
read -r answer < /dev/tty
if [ "$answer" != "y" ]; then
echo >&2 "プッシュを中止しました。"
exit 1
fi
# 入力が "y" の場合はプッシュを継続
exit 0
※ 僕、シェルはあまり強くないです。すみません。ご利用の際はご自身の環境でテストをお願いします。
※ 「ちょ待てよ。」の文言は強制ではありません。
5. 実行権限付与
chmod +x .git/hooks/pre-push
※ 環境によっては不要な場合もあるみたい
6. 動作確認
git push
------------------------------------------------------------------------
ちょ待てよ。ブランチ (kimutaku/come-on) をプッシュするよ? (y/n):
------------------------------------------------------------------------
y
Everything up-to-date
いい感じに動いてますね。
やっぱり目視でリアルタイムでブランチ名確認できると安心。
まとめ
導入してからまだ日は浅いですが、誤操作が減りそうな手応えを感じています。
アイデア次第で、ブランチ確認だけじゃなくていろいろできそうですね。
ちなみに...。
「ちょ待てよ」という確認メッセージですが、
変更し忘れたまま運用に慣れつつあるので、しばらくはキムタクと開発していきます。
追記: 2026/01/20
フォークいっぱいする人は特にと思うんですが、「リモートの名前」出したくないです?
プッシュ先がどのリモートかについては、現状のキムタクは教えてくれないようです。
てか、よくよく考えたら「ブランチ間違え」も怖いですけど、「リポジトリ間違え」の方が怖すぎますよね。
ってことで、セリフを変えてみました。
#!/bin/sh
# プッシュ先のリモート情報を取得
remote_name="$1"
current_branch=$(git rev-parse --abbrev-ref HEAD)
echo >&2 "「ちょ待てよ。"${remote_name} : ${current_branch}" をプッシュするよ?」 ( y / n )"
read -r answer </dev/tty
if [ "$answer" != "y" ]; then
echo >&2 "プッシュを中止しました。"
exit 1
fi
exit 0
ご参考までに。