9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Git】GitLabでSquash&mergeした後の差分がおかしい

Posted at

はじめに

タイトルで「おかしい」と書きましたが、正確には「既にマージ済みの内容が差分と表示されている」ということが起きましたのでまとめます。

事象

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から、developmentmasterの差分を確認すると、マージしたばかりなので差分もなくきれいな状態になっているハズ…あれ?たった今マージした内容が全て表示されている…だと?

featureブランチは開発が終わる事に削除していたため気づきませんでしたが、Squash & mergeでコミットをまとめてマージした場合、そのまとめたコミットは新規のコミットとして扱われるため、まとめた複数のコミットと中身は同じですが、異なるものとして判定され差分が表示されてしまったのではないかと思っています。

ここら辺が、自分のほうで調べても確定的なことがわからなかったのですが、今回のようなケースはソースコードは全く一緒なので、gitの差分はコミット(ソースコードのスナップショット)で判断しているのではないかと思っています。が、間違えていたらご指摘頂けますと幸いです。

featureの方でSquash & mergeしても良いときの条件を自分なりに書きましたが、developmentからmasterへのマージですと、粒度がかなり大きくなってしまい、内容も様々なものが混ざったコミットが出来上がってしまうので良くないですね。ここは自分でもわかっていたはずなのですが、今回やらかしてしまいました…反省ですね。

ちなみに、試験的に、今回のような既にマージ済みの内容が差分として表示されている状態で、強制的にマージしてみましたが、問題なく新規の変更点だけが変更された形になっていました。ただし、差分は依然として残り続けます。

まとめ

developmentブランチのような、常に残り続ける大きなブランチからmasterブランチなどへのマージの際は、Squash & mergeをしないようにした方が良い

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?