githubでfork元の変更を取り込む

githubで誰かのリポジトリをforkしたんだけど、自分がいじり始める前にその人が更新をした。差分を自分のforkしたリポジトリにも適用したいなーと思ったが、それはWebUIでできるのか、それとも自分の作業コピーで相手のをpullしてから自分のリポジトリにpushするのか…(from my tweet)

WebUIでできるのかなとしばらく探してしまったが見つけられなかったので下のようにした。taroのところにはfork元を作った人の名前を入れた。

$ git clone <myrepos>
$ git remote add taro <taro's repos>
$ git pull taro master

これで問題なく手元のリポジトリにマージされた。taroのリポジトリには書き込み権限がないから、僕が作業を行ったら自分のリポジトリにpushして、それからtaroにpullリクエスト出せばいいんだな。三角形。


p.s. 今回は自分の手元での編集をまだ行っていなかったんだけど、今後masterで作業をしているとpull時にコンフリクトが起きそう。気づいてなかった。(thanks @voluntas, @ssci, @okuryu)

pullをfetchとmergeに分けて、失敗しようのないfetchだけ先に成功させるとか。

$ git fetch taro
$ git merge taro/master

もしくは、そもそもgit checkout -b してそこで作業して、本家で更新があった時にはrebase -i masterするとか。

$ git checkout -b <work branch>
...
$ git pull taro master
$ git rebase -i master

最近ラボの星野さんとも話していたのだけど、ブランチ間のmergeに比べるとrebaseは-iを使って細かい粒度でマージでるので難しいコンフリクトになりにくいし。