🔜

gitの競合(コンフリクト)解決で、どちらかの競合を一括で正とする方法

に公開

Gitでブランチをマージしたり、git pullをしたとき、
package-lock.jsonなどで大量の競合(コンフリクト)が発生して
「うわ…直すの面倒くさい」と感じたことはありませんか?

このようなコマンドを打って自動生成されるファイルの競合の場合、
git checkout --ours {ファイル名} もしくは git checkout --theirs {ファイル名} というコマンドを打ってひとまず競合解決した後、
npm install などのコマンドでファイル内容を再生成すれば、最短で競合解決が可能になります。

git checkout --oursとは?

競合解決をする際、競合した箇所について全て現在のブランチの変更を採用することを意味するコマンドです。

git checkout --ours package-lock.jsonのように末尾にファイル名を指定すれば、
指定したファイルのみ、現在のブランチの変更を採用する競合解決を行うことができます。

※ファイル名を指定しなかった場合、競合した全ての箇所について現在のブランチの変更を採用することになります。

git checkout --theirsとは?

競合解決をする際、競合した箇所についてすべて現在のブランチの変更を採用することを意味するコマンドです。

git checkout --theirs package-lock.jsonのように末尾にファイル名を指定すれば、
指定したファイルのみ、マージしたブランチの変更を採用する競合解決を行うことができます。

※ファイル名を指定しなかった場合、競合した全ての箇所についてマージしたのブランチの変更を採用することになります。

ours並びにtheirsの関係図

マージや git pull の際、ours並びにtheirsは「どちらのブランチの変更を採用するか」を表しています。
以下の図にまとめました。

          (あなたが作業中のブランチ)
                    ↓
        ┌──────────────────────┐
        │  feature/login-page         │ ← ours(現在のブランチ)
        └──────────────────────┘
                    │
        マージ対象のブランチを統合(例: main)
                    │
        ┌──────────────────────┐
        │         main                │ ← theirs(マージしてくる側)
        └──────────────────────┘

まとめ

競合解決に関して他の人に説明しないといけない事情が発生したことがきっかけで、
よく忘れる内容を自ら記事にするきっかけとなりました。

他の人に物事を説明することは、小難しい言葉を使わずに丁寧に説明できるまで物事を理解する良い機会だと思います。

Discussion