ディップ Advent Calendar 2018 の1日目です。
はじめに
チーム開発をしていて、GitHubのプルリクエストでファイル差分を見たときに、
「masterと同じはずなのに差分として表示されている...なぜ?」となった経験はありませんか?
今回は、そのような事象にぶち当たったことがあるGit/GitHub初心者向けに、
GitHubのプルリクエストの差分の仕様についてまとめてみます。
また、その説明のためにGitのdiffコマンドのダブルドットとトリプルドットの違いについても確認します。
まずは、git diff
について
git diff
とは?
git diff
は、コミット<->コミットやインデックス<->ワークツリーなどの差分を表示するコマンドです。
具体的な利用方法については、こちらの記事が分かりやすくてオススメです!
忘れやすい人のための git diff チートシート - Qiita
2つのコミットの差分を確認したい時、git diff <commit1> <commit2>
という書き方以外に、
git diff <commit1>..<commit2>
やgit diff <commit1>...<commit2>
といった書き方もあります。
では、これらの違いとは...?
ダブルドット".."
ダブルドットの場合、指定した2つのコミット同士の差分を表示します。
以下の図でgit diff F..G
のように打つと、
コミットFとコミットGを比較して表示します。
ちなみに、git diff F G
とした場合と同じ結果になります。
トリプルドット"..."
トリプルドットの場合は、マージベース(2つのコミットの分岐点)との差分を表示します。
以下の図でgit diff F...G
のように打つと、
マージベース(分岐点)であるコミットBとコミットGを比較します。
そのため、コミットCやコミットEで変更された内容は表示されません!
では、GitHubのプルリクエストは?
GitHubのヘルプページにも書いてありますが、デフォルトは「トリプルドット」で表示されます。
By default, pull requests on GitHub show a three-dot diff, or a comparison between the most recent version of the topic branch and the commit where the topic branch was last synced with the base branch.
実際に試してみた
GitHub上でプルリクエストを作成し、差分の表示を確認してみます。
パターン1
以下のように、先程の図と同様の分岐となるようコミットしました。
各コミットでは、A,B,C...といったファイルを1つずつ作成しています。
masterブランチには、topic-1ブランチで追加したCとEがマージされています。
この状態で、topic-2ブランチからmasterブランチへマージするためのプルリクエストを作成。
Files changed
を見ると...
このように、マージベースとの差分であるDとGのみが表示されます。
masterブランチにあってtopic-2ブランチにはない、CやEについては表示されません。
パターン2
今度はこんな感じ。途中でCをtopic-2ブランチにもマージしてみます。
topic-2ブランチにはtopic-1ブランチからマージしたCが含まれています。
この状態で、topic-2ブランチからmasterブランチへマージするためのプルリクエストを作成。
Files changed
を見ると...
このように、マージベースとの差分であるC、D、Gが表示されます。
masterブランチにも同じCが存在するので、「あれ?」となりがちですが、
あくまでもマージベースとの差分であることがわかっているとギモンは解決できます。
まとめ
- git diffの".."はコミット同士の比較、"..."はマージベース(分岐点)との比較
- GitHubのプルリクエストの差分はマージベースとの比較(トリプルドット)
普段使っていると当たり前すぎて意識していないかもしれませんが、
特殊なフローで運用していたり、意図しない差分が表示されて困ったりした時は復習してみると良いかも。