Git
GitHub
AdventCalendar
GitDay 20

綺麗なpull requestを送るための3つのポイント

More than 5 years have passed since last update.

これはGit Advent Calendar / Jun.20日目の記事です。前回は、fukajunさんの変更を一時的に退避!キメろgit stashでした。

この記事ではgithubでpull requestを送る時に私が気をつけていることを共有したいと思います。

私が気をつけていることは次の3つです。

  • masterにコミットしない
  • 簡潔なコミットメッセージを書く
  • コミットを1つにまとめる

この話の前提

以降では、次の2つのリモートリポジトリが登録されている前提で説明します。

  • upstream: fork元のリポジトリ
  • origin: upstreamからforkされた自分のリポジトリ

masterにコミットしない

修正作業は必ず新しいブランチを作ってから行ない、masterブランチはあくまでupstreamの更新を取り込むためだけに使って下さい。

このルールを守らないでpull requestを送り続けているとupstreamの更新内容を取り込んだ時に謎のコンフリクトが発生したり、pull requestに謎のコミットが追加されるようになります(というか、なりました)。

このルールに従って修正作業を進めている場合、以下の手順でupstreamの更新内容を取り込むことが出来ます。(作業ブランチ: add-great-feature)

$git checkout master
$git pull upstream master

これでupstreamの更新がローカルのmasterブランチに取り込まれました。次に、自分のリモートリポジトリをupstreamと同期します。

$git push origin master

この状態でgithubでリポジトリの履歴をみると、元プロジェクトの履歴と同じになっていることが確認できます。次に、作業ブランチにupstreamの更新内容を反映します。

$git checkout add-great-feature
$git rebase origin master

以上で、upstreamの更新内容を現在の作業ブランチに取り込むことができました。pull requestを送る前には必ずこの作業を行ってください。

簡潔なコミットログを書く

pull requestはfork元のプロジェクトメンバーへラブレターを送るようなものです。仮に貴方が受け取ったラブレターに"Some changes"とか"Fixed"とか書いてあったらどうしますか?私ならリジェクトします。そんな悲しいことにならないよう、pull requestを送る前にはかならずコミットメッセージを見直して修正内容が簡潔に説明されているかを確認して下さい。

もし、コミットメッセージを修正する必要がある場合は、

$git commit --amend

とすることで修正することができます。

コミットを1つにまとめる

プロジェクトの方針によるとは思うのですが、一般に他人の作業ログで自分の管理しているリポジトリの履歴が汚れることを好む開発者は少ないと思います。送られて来たpull requestのコミットメッセージに、"移動するので一旦コミット"とか書かれていたらどんなにすばらしい修正であっても受け入れがたいと思いませんか?重要なことなのでもう一度言いますが、

pull requestはラブレター

なんです。だらだらと意味不明なコミットが続くのではなく、ビシッと1コミットでキメて下さい。

$git rebase -i

このコマンドを実行すると、エディタが起動してコミットの一覧が表示されます。例えば、

pick 9bb3a8c 移動するので一旦コミット
pick 5e3b6cc 凄い機能の実装が完了した

という一覧が表示されます。このコミットを1つにまとめてコミットメッセージを書き直すには、

reword 9bb3a8c 移動するので一旦コミット
fixup  5e3b6cc 凄い機能の実装が完了した

とします。するとrebaseが開始され、今度はコミットメッセージの編集が始まるので簡潔なメッセージに修正して下さい。"rebase -i"の使い方すべてを書き下すには、この余白は狭すぎるのでPro Git Bookを参照して下さい。

まとめ

pull requestを送るのはなんだか敷居が高いと感じている人も多いかと思いますが、本物のラブレターを送るよりかは敷居が低いことは間違いありません。コードとコミットメッセージで世界中の開発者と語り合ってはいかがでしょうか?