コンフリ解消したPull Requestの差分が見にくくなる原因と対処法

に公開

まえがき

走り書きです!

コンフリ解消して、GitHubにPull Requestを出して差分を確認すると、コンフリ解消と関係ない部分まで差分に表示されてめちゃめちゃ見にくいという事態が発生したので対処方法をまとめました。

自分のコンフリ解消法と差分の見え方

mainブランチから新しいブランチを切って作業すると、作業の間にmainブランチが他の作業者(ブランチのマージ)によって変更され、差分がコンフリクトする時がある。

コンフリ解消のアプローチはいくつかあると思うが、自分は、

「ローカルのmainに移動して最新のmainをpull」
⬇️
「作業中のブランチに最新のmainをmerge」
⬇️
「自身のテキストエディタ上でコンフリ解消、変更をコミット」

という風に行っている。(おそらくこのやり方か、git rebaseを使うやり方がほとんどだと認識している )

このやり方でPull Request(記事共有ボタンを実装するというもの)を出したところ、以下のような差分表示になった。

mdファイルが大量に削除されているが、これは、コンフリした部分とは関係のない、「不要な記事の削除」という別ブランチでの変更だ。これはすでに別の作業ブランチからmain(最新)に反映(マージ)されているから、今回の「記事共有ボタンを実装する」という変更のブランチとmainブランチとの比較で出てこないで欲しい。(変更箇所が見にくいので)

これが表示されている理由の一つとしては、最新のmainブランチ(不要記事削除済み)を作業中のブランチにmergeしたからだと考えられるが、だとしてもmainブランチとの比較においてなぜ出てくるのか少し疑問だった。

ツードット比較とスリードット比較

gitにおけるブランチの比較には、ツードット比較スリードット比較があるとのこと。

以下、mainブランチから、devAブランチを切ったことを考える

ツードット比較

mainブランチとdevAブランチをツードット比較する時、

devAブランチは、mainブランチの最新の状態と比較される。
今回の例で言えば、
記事共有ボタンを実装するブランチ(ブランチ名feat/shareButtonInArticle)
と比較されるのは、最新のmainブランチ(ブランチを切った後の、不要記事削除などの変更が行われた後のmainブランチ)

である。

スリードット比較

mainブランチとdevAブランチをツードット比較する時、

devAブランチは、devAブランチを切った時のmainブランチの状態と比較される。
今回の例で言えば、
記事共有ボタンを実装するブランチ(ブランチ名feat/shareButtonInArticle)
と比較されるのは、feat/shareButtonInArticle切ったタイミングのmainブランチ(不要記事削除などの変更が行われる前のmainブランチ)

である。

つまり、先ほどのGitHubの差分表示はスリードット比較をしていることになる。最新のmainをマージしたことで、不要記事削除などの変更もfeat/shareButtonInArticleに反映されたが、比較対象のmainブランチは、最新のmainブランチではなく、feat/shareButtonInArticleを切った当時のmainブランチである。

GitHub上でPull Requestを最新のmainブランチと比較する

https://github.com/<ユーザー名>/<リポジトリ名>/compare/main..<作業ブランチ名>

これでOK。..が、ツードット比較にあたる部分である。スリードット比較にするなら...とすれば良いが、これは普段見ている差分画面と変わらない。(なんでURL直打ちでしかこのページに到達できないんだ?)

GitHub: ツードット比較


最新のmainとの比較なので、記事削除などの差分は表示されない。

GitHub: スリードット比較


記事削除などの変更も表示されてしまっている。最新のmainでは記事削除済みだが、ブランチを切った当時のmainブランチでは記事削除の変更はされていないので、表示されてしまっているとわかる。

終わりに

(確かgitlabだとGUI上で最新のmainと比較することできた気がするなぁ...)と思う、GitHub初心者でした。お読みいただきありがとうございました🙇🏻‍♂️

普段はがむログで記事を投稿しているので、興味があればぜひ見てみて下さい🙌

↓このブログ自体を開発してきた流れなども開発日記として記事にしてます👀
https://www.gamulog.com/

Discussion