先日、初めてPull Request(以下、PR)をしてMergeされる機会があったので、流れをまとめておく。
この話題については既にたくさんの記事が存在するが、備忘録として、書いておく。
ホスティングサービスはGitHubを使っている前提で書いているが、他のホスティングサービスでも問題ないはず。
GitHub Flowで作業していく。トピックブランチで作業を行い、それをmasterにマージする。
Forkから作業を終えるまで
PRするためには当然ながら、自分のリポジトリにおいて、コードの追加なり変更なりを行う必要がある。
まず、そこまでを完了させる。
1 Forkする
2 $ git clone Forkしてきたリポジトリのパス
Forkは、GitHub上の簡単なボタン操作で可能。
これで、自分のアカウント上に、Forkしてきたリポジトリが出来る。
それをクローンすれば、ローカルで作業出来るようにする。
3 $ git checkout -b topic-branch
4 作業とコミットを繰り返す
5 $ git push origin topic-branch
作業用のブランチ、今回の場合はtopic-branchを作成し、そこで作業とコミットを繰り返す。
作業が終わったらまず、リモート上の自分のリポジトリにpushする。
自分のリポジトリはデフォルトでoriginという名前で登録されているはずなので、5のコマンドで、pushできる。
これで、自分のリポジトリ上での作業は終わった。
Fork元のリポジトリの変更を取り込む
複数人数で作業している場合、自分のリポジトリで作業している間に、Fork元のリポジトリの内容が更新されている場合がある。
その場合は、自分のリポジトリにその差分を取り込み、Fork元のリポジトリの最新の状態に合わせる必要がある。
6 $ git remote add upstream Fork元のリポジトリのパス
Fork元のリポジトリを、リモートリポジトリとして登録する。ここでは、upstreamという名前にした。
これで、originとupstreamという2つのリモートリポジトリが登録されている状態になった。
前者は自分のリポジトリで、後者はFork元のリポジトリ。
7 $ git checkout master
8 $ git pull upstream master
9 $ git push origin master
Fork元のリポジトリのmasterブランチからpullしてくる。
これで、ローカルリポジトリのmasterブランチは、最新の状態になった。
そして9で、originのmasterブランチにもその変更を反映させる。
10 git checkout topic-branch
11 git rebase master
12 git push -f origin topic-branch
topic-branchでrebaseすることで、自分の作業結果は残しつつ、最新のmasterの状態を取り込める。
それをpushすることで、originが、Fork元のリポジトリの最新の状態を反映しつつ自分の作業も終えた状態になる。
これで、PRが出来る状態になった。
PRからMergeまで
13 Pull Request
14 コードレビュー
15 (修正が必要な場合)$ git push origin topic-branch
PRは、GitHub上の操作で行える。baseに対してcompareをPRするよう、リポジトリやブランチを選択する。
PRが作成された後は、コードレビューなどを経て、Mergeされる。
場合によっては、コードの変更が必要になるかもしれない。その場合は、ローカルで作業を行った後、15のようにpushすればいい。そうすれば、PRの内容も自動的に変更される。
問題がないと判断されれば、Mergeされる。
これでPRは完了。
最後に、後片付けを行う。
ブランチの整理
16 git checkout master
17 git pull upstream master
18 git push origin master
ローカルのリポジトリを最新の状態に保つため、upstreamからpullしてくる。そしてその後、originにpush。
これで、ローカルリポジトリとorigin、両方のmasterが、PR後のupstreamのmasterと同じ状態になる。
これで、作業用に作成したtopic-branchは不要になったので、削除する。
19 git branch -d topic-branch
20 git push origin :topic-branch
まずローカルの、次にoriginのtopic-branchを削除する。
またPRを作成することになったら、改めてトピックブランチを作成し、同じ手順を繰り返せばよい。