Fork 元とローカルのレポジトリを同期するエイリアスを考える

概要

題名の通り。 Fork 元との同期は忘れがちであり、かつコマンドもよく忘れてしまう。 git fetch upstream -> git rebase upstream/master みたいな形ではあるが、どうも忘れがち。

そこでエイリアスに登録してしまおう、というのが主目的となる。

私の環境

  • OS: MacOS 10.14
  • Git version: 2.21.0
  • Shell: zsh 5.7.1-dev-0

以降については、この環境で検証しているため、特に他の OS 、 Shell の場合は動作保証ができない。(特殊なコマンドを使っていないので、 grep コマンドの動作だけ怪しいが、少しいじれば動くものとは思われる)

生成物

前提条件

git remote add upstream で upstream に Fork 元のリポジトリを登録しておく。

不安なら Git リポジトリのルートで cat .git/config とかで見とくと安心。こんな感じのものがあるはず。( yumechi を自分のユーザー名、 kashikoma を Fork 元、 mirei をリポジトリ名として見てください)

# (前略)  
[remote "origin"]  
    url = git@github.com:yumechi/mirei.git  
    fetch = +refs/heads/*:refs/remotes/origin/*  
[remote "upstream"]  
    url = git@github.com:kashikoma/mirei.git  
    fetch = +refs/heads/*:refs/remotes/upstream/*  
# (後略)  

また、 upstream の同期したいブランチ名と、ローカルのブランチ名が一致していることを確認する。一致してない場合は checkout する。( master に同期したい場合は git checkout --track origin/master とかで一旦ローカルを master にしておく)

alias

    upstream-pull = "!f () { if git remote | grep upstream -q; then b=$(git rev-parse --abbrev-ref HEAD); git fetch upstream; git rebase upstream/"$b"; unset b; else echo '** error: set upstream !! **'; fi }; f"  

https://www.shellcheck.net/ で異常がないか確認しつつ、整形したので多分問題ないはず。

使用してる関数を整形したもの

見づらいので、整形版を張っておく。

    upstream-pull = !"f() { \  
    if git remote | grep upstream -q; then \  
        b=$(git rev-parse --abbrev-ref HEAD); \  
        git fetch upstream; \  
        git rebase upstream/"$b"; \  
        unset b; \  
    else \  
        echo '** error: set upstream !! **'; \  
    fi \  
    }; \  
    f"  

現在のブランチを upstream に同期するようにしているが、 master ブランチだけでもよかったのでは? という考え方もある。しかし、デフォルトブランチが master でない場合も自分が関わっている範囲でたまにあるため、現在のブランチを同期するようにしている。そのため、同期したいブランチはこのコマンドを打つ前に checkout しておく必要がある。

あとから見た記事

基本的に自分でコマンドを書いていたので、 Qiita 上で探していなかったが、とりあえず良さそうだと思ったのを貼る。