💥

マージとコンフリクト解消を分離してコミットする(追記あり)

に公開

2025-12-01追記

もっと良い方法がありました。
git show --remerge-diff <Merge commit hash> でどのようにコンフリクト解消したか後から確認できます。
こちらのほうが、コンフリクトマーカがコミットに残らないので、git bisectで二分探索をする際にビルドエラーにならず、調査を阻害しないメリットがあります。

はじめに

皆さんはgitのコンフリクト解消はどのように行っているでしょうか?
例えば、PRでブランチAブランチBにマージするとき、私は今まではGitHubのPRのcommand line instructionsに表示される手順の通り、ブランチBにブランチAをマージしその自動マージのコミットの中でコンフリクトを解消していました。

操作例

(branchA)$ git pull origin branchA
(branchA)$ git checkout branchB
(branchB)$ git merge branchA  # 自動マージでコンフリクト発生
(branchB)$ vim confilicted.js # コンクフリクト解消
(branchB)$ git add .
(branchB)$ git commit # マージコミットを作成

GitHubのドキュメント

しかし、これでは変更差分が大きいときはどのようにコンフリクト解消したか後から分かりづらいです。特にコンフリクト解消にミスがあった際に調査が難航してしまいます。
そこでマージとコンフリクト解消を分離してコミットする方法を共有します。

マージとコンフリクト解消を分離してコミットする方法

非常に単純でコンフリクト解消をする前に自動マージの結果をすべてコミットしてしまえばよいです。

操作例

(branchA)$ git pull origin branchA
(branchA)$ git checkout branchB
(branchB)$ git merge branchA  # 自動マージでコンフリクト発生
(branchB)$ git add .
(branchB)$ git commit # コンフリクトしたままマージコミットを作成
(branchB)$ git grep '>>>>>>>' # コンフリクトマーカーを探す
(branchB)$ vim confilcted.js # コンフリクト解消
(branchB)$ git commit conflicted.js -m 'resolve confilict' # コンフリクト解消コミットを作成

これで後から問題が発生したときにコミット履歴をたどることで、どのようなコンフリクト解消をしたか調査が可能になります。

参考文献

https://zenn.dev/wilf/articles/9502f5375a6581

Urth

Discussion