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されました。