はじめに
タイトルで「おかしい」と書きましたが、正確には「既にマージ済みの内容が差分と表示されている」ということが起きましたのでまとめます。
事象
・development
ブランチからmaster
ブランチへSquash & mergeした後、別のマージリクエストでmaster
ブランチへマージしようとしたとき、Squash & mergeした時の内容が差分に表示されている。
・git diff development master
コマンドを打った時も同様に、既にマージ済みの内容が差分として表示される
解決方法
・Squash & mergeをしない
…解決方法、ではないですね。
featureからdevelopmentへ
Gitの運用方法は職場・現場によって様々だと思いますが、多くのところではmaster
> staging
> development
> feature
とブランチが切られているのではないでしょうか。
この時、development
ブランチから、個人の開発用・issueブランチとしてfeature
ブランチを切って作業をする場合、微修正コミットや、ローカルでは動作が確認できないのでとりあえずPushしてリモート環境で確認するためのコミットを連発してしまった、などでブランチ内のログを荒らしてしまったことはありませんか?僕はあります。
上記のような場合には、GitLabでdevelopment
に向けてマージリクエストを作成する時に、「Squash commits」にチェックを入れてコミットを一纏めにすると同時に、「Delete source branch」にもチェックを入れることでマージ後にはfeature
ブランチを削除する、という流れがきれいだと思っており、実際にこの方法で運用しています。
git rebase
でコミットをまとめる方法もありますが、上記のような、①ターゲットブランチに対して新規のコミットである、②全てのコミットが自分だけである、③粒度がそれほど大きくならない、という状況であればSquash & mergeの方が早くて簡単かなと個人的に思っています。
developmentからmaster(staging)へ
個人開発用・issueブランチはマージリクエスト完了後、つまりそのissueを解決した後は削除した方がごちゃごちゃせずに済むかと思います。リモートブランチにはmaster
staging
development
ブランチが存在し、進行中のfeature
ブランチだけが残っている状態が簡潔で良いです。
さて、今度はdevelopment
からmaster(staging)
へ向けてマージしたいと思います。feature
は都度削除をしていましたが、今回はdevelopment
ブランチなので「Delete source branch」にはチェックを入れずに、「Squash commits」だけチェックを入れ、Squash & merghを行います。作成したマージリクエスト上で特にコンフリクトがなければそのままマージしてしまいます。問題なくマージが完了しました。
GitLabのCompare
から、development
とmaster
の差分を確認すると、マージしたばかりなので差分もなくきれいな状態になっているハズ…あれ?たった今マージした内容が全て表示されている…だと?
feature
ブランチは開発が終わる事に削除していたため気づきませんでしたが、Squash & mergeでコミットをまとめてマージした場合、そのまとめたコミットは新規のコミットとして扱われるため、まとめた複数のコミットと中身は同じですが、異なるものとして判定され差分が表示されてしまったのではないかと思っています。
ここら辺が、自分のほうで調べても確定的なことがわからなかったのですが、今回のようなケースはソースコードは全く一緒なので、gitの差分はコミット(ソースコードのスナップショット)で判断しているのではないかと思っています。が、間違えていたらご指摘頂けますと幸いです。
feature
の方でSquash & mergeしても良いときの条件を自分なりに書きましたが、development
からmaster
へのマージですと、粒度がかなり大きくなってしまい、内容も様々なものが混ざったコミットが出来上がってしまうので良くないですね。ここは自分でもわかっていたはずなのですが、今回やらかしてしまいました…反省ですね。
ちなみに、試験的に、今回のような既にマージ済みの内容が差分として表示されている状態で、強制的にマージしてみましたが、問題なく新規の変更点だけが変更された形になっていました。ただし、差分は依然として残り続けます。
まとめ
・development
ブランチのような、常に残り続ける大きなブランチからmaster
ブランチなどへのマージの際は、Squash & mergeをしないようにした方が良い