Help us understand the problem. What is going on with this article?

GitHubのプルリクエストの差分はどこと比較しているか?(git diffの".."と"..."の違い)

More than 1 year has passed since last update.

ディップ 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を比較して表示します。
image.png

ちなみに、git diff F Gとした場合と同じ結果になります。

トリプルドット"..."

トリプルドットの場合は、マージベース(2つのコミットの分岐点)との差分を表示します。
以下の図でgit diff F...Gのように打つと、
マージベース(分岐点)であるコミットBとコミットGを比較します。
そのため、コミットCやコミットEで変更された内容は表示されません!
image.png

では、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.

参考: https://help.github.com/articles/about-comparing-branches-in-pull-requests/#three-dot-and-two-dot-git-diff-comparisons

実際に試してみた

GitHub上でプルリクエストを作成し、差分の表示を確認してみます。

パターン1

以下のように、先程の図と同様の分岐となるようコミットしました。
各コミットでは、A,B,C...といったファイルを1つずつ作成しています。
image.png

masterブランチには、topic-1ブランチで追加したCとEがマージされています。
image.png

topic-2ブランチはこんな感じ。
image.png

この状態で、topic-2ブランチからmasterブランチへマージするためのプルリクエストを作成。
Files changedを見ると...
image.png

このように、マージベースとの差分であるDとGのみが表示されます。

masterブランチにあってtopic-2ブランチにはない、CやEについては表示されません。

パターン2

今度はこんな感じ。途中でCをtopic-2ブランチにもマージしてみます。

image.png

masterブランチは先程と同じ。
image.png

topic-2ブランチにはtopic-1ブランチからマージしたCが含まれています。
スクリーンショット 2018-11-29 17.13.46.png

この状態で、topic-2ブランチからmasterブランチへマージするためのプルリクエストを作成。
Files changedを見ると...
image.png

このように、マージベースとの差分であるC、D、Gが表示されます。

masterブランチにも同じCが存在するので、「あれ?」となりがちですが、
あくまでもマージベースとの差分であることがわかっているとギモンは解決できます。

まとめ

  • git diffの".."はコミット同士の比較、"..."はマージベース(分岐点)との比較
  • GitHubのプルリクエストの差分はマージベースとの比較(トリプルドット)

普段使っていると当たり前すぎて意識していないかもしれませんが、
特殊なフローで運用していたり、意図しない差分が表示されて困ったりした時は復習してみると良いかも。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away