5
2

More than 3 years have passed since last update.

[Git小技] ブランチを切り替える時に自動的に最新の状態にする #git

Posted at

普段Gitを使ってて頻繁にブランチの切り替えを実行しているとたまに git pull を忘れてしまい、作業が完了して git push しようとすると既にリモートには別のコミットが存在してエラーになってしまうことがあります。
その時には git pull すればいいんですが、コミットログに不要な merge が入ってしまい少し気持ち悪いですね。
Gitでブランチを切り替える際に自動的に最新の状態を pull すればそういう問題は解消しそうです。

Git Hooks

Git HooksとはGitで何かしらのイベントが発生する前後でスクリプトを実行可能にする仕組みです。
exit 0 でスクリプトが終了すればその先の処理も実行されますがそれ以外( exit 1 など )で終了すると処理を途中で止めることができます。
具体的には公式のドキュメントを参考にしてください。

post-checkout

先述した公式のドキュメントには掲載されていませんが、 post-checkout を利用すればブランチ切り替えの際にスクリプトを実行することができます。
それでは簡単なスクリプトを作成してみましょう。

前提

Gitがインストールされ、 .git ディレクトリが存在するパスで作業することを前提にしています。
Gitが利用できるLinux系のOSであれば大抵問題無いかと思いますが、当方の作業OSはmacOS 10.15.2(19C57)、 git version 2.23.0 です。

スクリプトの作成

Terminal上で作業します。

# post-checkoutファイルの作成
touch .git/hooks/post-checkout

# 実行権限を付与
chmod +x .git/hooks/post-checkout

# ファイルを編集
vim .git/hooks/post-checkout

vimの画面上でiキーを押下して⌘+Vで下記のスクリプトを貼り付けます。

#!/bin/sh

# 現在のブランチを取得する(参考: https://qiita.com/sugyan/items/83e060e895fa8ef2038c)
CURRENT_BRANCH=`git symbolic-ref --short HEAD`
# リモートの情報をfetchする
git fetch -p
# リモート(origin)にブランチが存在するかどうかを判定
exists=`git show-ref remotes/origin/$CURRENT_BRANCH`
if [ -n "$exists" ]; then
    # リモートにブランチが存在すればpullを実行
    git pull origin $CURRENT_BRANCH
fi

esc キーを押下して :wq と入力してEnterを押下して保存してvimを終了します。

結果

git switchgit checkout でブランチを切り替えると最新の情報を取得してくるスクリプトが完成しました。

% git switch master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
From github.com:fromkk/SpellChecker
 * branch            master     -> FETCH_HEAD
Already up to date.

ただ、ブランチ切り替えの際に少し待つようになってしまうので人によっては邪魔に感じてしまうかもしれません。
利用する際は用法・用量を守って正しく利用しましょう。

5
2
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
5
2