Git でブランチがリモートリポジトリの HEAD から派生しているかどうかを確認する
Git でトピックブランチを切るときに、元ブランチで git pull し忘れて古いコミットから生やしてしまうときがある。
最新の変更を認識できなかったり、後々コンフリクトが起きたりと不便なことがままあるので、 Commit 前に HEAD がリモートリポジトリの HEAD から派生しているかを確認するスクリプトを書いてみた。
Git には Commit 前に pre-commit hook を実行することができる。そこで non-zero code で exit すれば Commit 処理が中止されるので、これで防ぐようにする。
コード
これを .git/hooks/pre-commit
内に置く。
git fetch origin if ! git merge-base --is-ancestor origin/HEAD HEAD; then echo "ERROR: HEAD is not based on upstream HEAD" exit 1 fi
解説
まず git fetch origin
でリモートリポジトリを fetch する。
その後、「ブランチが origin の HEAD から派生しているかどうかを確認する」ために git merge-base
を使う。今回は HEAD
の祖先に origin/HEAD
がいるかどうかを確認しており、祖先にいなければ派生元のコミットが古いということで exit 1
し、祖先にいれば Commit を続行するようにしている。
git merge-base --is-ancestor
が便利、というお話でした。