pull request後にupstreamに更新が入ったのでrebaseしてconflictを解消してpush -fする話

azkabanというソフトを使っていて手元でバグっぽいのを見つけたのでpull requestしたんですよ。

How to Contributeに従ってまずGitHub issueを作ってその後、https://github.com/azkaban/azkaban2 から自分のところにforkして以下のように作業しました。

まあ大半の作業はSourceTreeからやっていることを告白します。

$ git clone https://github.com/wyukawa/azkaban2.git
$ cd azkaban2
$ git remote add upstream https://github.com/azkaban/azkaban2.git
$ git checkout -b issue-247
$ vim ... //実際はEclipseでコード修正
$ git add ... //実際はSourceTreeでadd
$ git commit ... //実際はSourceTreeでcommit
$ git push origin issue-247 //実際はSourceTreeでpush

その後コメントもらったのでコード修正して再度pushしました。ここまではいいです。基本ですね。

で、ですね、その後upstreamのmasterがソースフォーマットの変更をおこなったのでソースががっつり変わってconflictが起こるような状況になったんですよ。

Gitのリビジョングラフ的にいうと

          1---2---3 *issue-247
         /
A---B  master

が以下のようになったイメージです。

          1---2---3 *issue-247
         /
A---B---C---D master

ちなみにこの辺のグラフはrebase について - ぐるぐる~を借用されていただきました。m( )m
またこのエントリをみつつ後述のrebase作業をやりました。

このような場合pull requestを受ける側からするとconflictの解消を自分でやりたくないし、すんなりmergeできるように相手側にrebaseしてって言う場合があります。

今回のケースだとこんな感じでrebaseしてって言われています。mergeでもいいらしいけどそこはやり方よくわからなかったのでスルーしました。

や、話には聞いていたけど、実際に遭遇したのは初めてだったので大変オドオドしたわけです。
空気を吸うようにOSS活動している人にとってはどうってことないことだと思いますが、GitHub弱者の僕には応用問題だったわけです。

まあともかくrebaseして下記のようにします。

               1---2---3 *issue-247
              /
A---B---C---D master

そこでまあ下記を実行するわけですが、conflictするのですんなりいきません。

$ git rebase master

conflictを頑張って解消してgit addしたらgit rebase --continueします。

これらが全部終わって問題ないコミットが出来たらgit push -fします。

$ git push -f origin issue-247

そうするとGitHub上ではこんな感じになります。コミットが下の方にまとまって表示されるようになってますね。

たぶん、これで良いんだと思いますが、まだmergeされてないのでなんとも言えないですね。


追記:
無事mergeされました。