• 作成:
  • 更新:

GitHubで他人のプルリクエストに対しコンフリクト解消や追加の修正を行いつつマージするもう1つの方法

GitHub

単純なコマンドラインでmergeする方法が使えない時

本の虫: GitHubで他人のプルリクエストに対しコンフリクト解消や追加の修正を行いつつマージする方法を読んで, そう言えば私もバイトで最初にチーム(私と社長で2人)で作業を行うときに戸惑ったなあと思い出しました.

なので, 今のバイト先の社長から教えてもらった, もう1つの方法を紹介します.

江添さんの述べた方法は, シンプルでわかりやすいですが, 我々のチームでは使えません.

何故ならば, 我々のリポジトリにはTravis CIによる自動テストが導入されているからです. そして, コードレビューで承認を貰い, 自動テストが成功していない限り, 原則masterにはそのpull requestをmergeしてはいけないというルールがあります.

なので, 社長が作ったpull requestが気に入らなくて私が修正をしたい場合も, ローカルでcommitするだけではなく, pull requestが作られたブランチにpushして, Travis CIによる自動テストをかける必要があります.

ちなみに, 何故我々のリポジトリが組織リポジトリに属さずに私個人アカウントのリポジトリになっているのかは, 単に私が適当に作ってしまったからです. 学割の対象になっているので結果的に良かった.

また, 我々2人は対等の立場なので, 社長が作ったpull requestが気に入らなくて私が編集を行ったら, 社長がそれは気に入らないと言うことも良くあります. いや, ちゃんとpull requestのコードレビューで議論をしろというのはもっともなのですが, 自然言語で議論するより実際のコードをぶつけたほうが互いの理想がわかりやすいということがあります.

他人のプルリクエストに対して修正をする方法

前置きが長くなりました, 他人のプルリクエストに対して修正をする方法を述べます.

事前準備

まず, Allowing changes to a pull request branch created from a fork - User Documentation に書いてあるように, pull reqeustを開く人には, Allow edits from maintainersのチェックボックスを有効にしてもらいましょう.

Improving collaboration with forksによると, pull requestを開く前にも開いた後にも有効にすることが出来るようです. デフォルトで有効のはずですが, もし有効になってなかったらpull requestを開いた人に有効にしてもらいましょう.

具体的な手順を述べます. 普段magit(Emacsのgitクライアント)ばかり使っているのでコマンドラインが正しいのか全然自信がないですが, 雰囲気だけでも感じておいて欲しいです.

ここで, 対象のリポジトリ名をapplication, pull requestを開いたGitHubユーザー名をcontributor, pull requestに使われたブランチ名をadd-fooとしておきます.

hubコマンドが使える場合

hub(GitHubが提供しているGitを拡張するツール)を使っている場合はcheckoutするのが楽です.

デフォルトではgitプロトコルが選択されてしまうようなので, 事前に以下のコマンドでhttpsを使うように設定しておきましょう.

git config --global hub.protocol https

その後

git checkout https://github.com/myusername/application/pull/1

のようにpull requestのURLをcheckoutしましょう.

hubコマンドが使えない場合

hubコマンドが使えない場合は, pull requestを修正したいと思った時はforkされたリポジトリのページを開いて, URLをコピーします.

それをgit remote addでremoteに追加します.

git remote add contributor https://github.com/contributor/application.git

ここで, URLのプロトコルにはgitを使ってはいけません. httpsを選択しましょう.

別にremote名は何でも良いのですが, 私は後々わかりやすくするためにGitHubユーザー名と同じにしています.

remote全てのbranchを取得します.

git fetch -p --all

そして, 編集したいブランチをcheckoutします.

git checkout -b add-foo contributor/add-foo

commitしてpush

そして, 編集した内容をgit commitしたら,

git commit

pull requestのブランチにgit pushします.

git push --set-upstream contributor add-foo

そしたらpull requestの内容が変わっていることでしょう.

それでTravis CIによる自動テストも通って, contributorも変更に納得したら, webでpull requestを取り込んでしまえます.

GitHub側でremote branchをremoveしたら, git fetch -p --allでremote branchも消してしまいましょう.

この方法を使っていれば, contributorが開いているbranchがわかるので, 共同作業がやりやすいというメリットもあります.

また, チームメンバーが固定されていれば, 次からはremoteを追加する必要は無くなります. git fetch -p --allしてcheckoutしてcommitしてpushするだけです.