Edited at

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 上で探していなかったが、とりあえず良さそうだと思ったのを貼る。