概要
題名の通り。 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 上で探していなかったが、とりあえず良さそうだと思ったのを貼る。
- フォークと本家を同期させる Git エイリアス
- https://qiita.com/ybiquitous/items/bc1af6655e340ff853e8
- 公式リファレンスを引いて、コマンドをベタでつなげてるだけっぽいが、 GitHub のドキュメントを私は探しに行かなかったので参考になった
- よく使うgitコマンド一覧
- https://qiita.com/suzukihi724/items/3fcfb891f5768293404c#3-%E3%83%8F%E3%83%9E%E3%82%8A%E7%B3%BB
- ハマり系がすごいわかりやすい(今日書いた alias も適当に書いたものなので、ハマり系になりそうな気はする(が、それもまた経験ということでハマってなれたらササッと解決したいと思う))