【Xcode/Git】.xcodeprojファイルのコンフリクト解消方法

この記事からわかること
- Xcodeで.xcodeprojファイルがコンフリクトした際に解消方法
- 「The file couldn’t be opened.」の原因
- SourceTreeを使用した場合
index
[open]
\ アプリをリリースしました /
.xcodeprojファイルのコンフリクトを起こす原因
.xcodeprojファイル(プロジェクトファイル)がコンフリクトを起こしてしまうのはファイルを追加や操作を行った際に発生ことが多いです。プロジェクトファイル内ではXcodeで管理対象のファイルが記述されており、追加や削除、移動、名前変更などを行うとプロジェクトファイル内も自動で書き換えられます。
プロジェクトファイルでコンフリクトが発生すると「The file couldn’t be opened.」というエラーが発生してプロジェクトファイル自体が開けなくなり、アプリをビルドすることすらできなくなってしまいます。

コンフリクトの発生を再現
以下の手順で操作すれば.xcodeprojファイルのコンフリクトが再現できます。
- mainブランチからブランチAを切る
- Aファイルを追加、コミット
- mainブランチからブランチBを切る
- Bファイルを追加、コミット
- mainブランチにブランチAをマージ
- mainブランチにブランチBをマージ (コンフリクト)
手動で解消する
プロジェクトファイルがコンフリクトを起こした際はVScodeなど別のエディタからファイルを開き、手動で修正することで解消することも可能です。解消方法はコンフリクトのマークを全て消していくだけです。
<<<<<<< HEAD ← 削除
12AF31FF2AC2D48400A6A05F /* TestAA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12AF31FE2AC2D48400A6A05F /* TestAA.swift */; };
======= ← 削除
12AF32012AC2D49900A6A05F /* TestBB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12AF32002AC2D49900A6A05F /* TestBB.swift */; };
>>>>>>> TestB ← 削除
ですがこの方法ではうまくいかない場合があったので別の方法を探していたところXcodeから簡単に解消できました。
Xcodeから解消する
Xcodeからマージを試みていた場合は以下のようにすることで解消できた
- コンフリクト発生
- Choose Left Then Right
- 解消

Xcodeでマージを試みた場合にコンフリクトが起きると上記のような画面になり、該当ファイルのコンフリクトが起きている箇所を分かりやすく示してくれます。それぞれ、どちらか片方のみを残すか両方残すか選択できるので「Choose Left Then Right(左を先に生かして右を下に追記する)」を選択することで解消できました。
SourceTreeから解消する
SourceTreeを利用している場合は以下の手順で解消できました。
- コンフリクト発生
- Mainブランチに起きているプロジェクトファイルの変更を一度破棄する
- ファインダーで該当ファイルを探しドラッグ&ドロップでXcodeプロジェクトに入れ込む
- コミットしてマージ
- 解消
1.コンフリクト発生
SourceTreeでマージを試みた際にマージが発生すると以下のようになります。

「ファイルステータス」では「!」マークのものがコンフリクトを起こしている状態になります。

2.Mainブランチに起きているプロジェクトファイルの変更を一度破棄する
解消するためにはまずプロジェクトファイルの変更を破棄します。これで該当ファイルは削除されませんが、Xcodeプロジェクトへの追加はなかったことになります。

3.ファインダーでファイルを探しドラッグ&ドロップでXcodeプロジェクトに入れ込む
該当ファイルは消えていないのでファインダーで該当ファイルを探しドラッグ&ドロップでXcodeプロジェクトに入れ込みます。

4.コミットしてマージ
これで変更は解消されたのでコミット(マージを完了)させればOKです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。