ここ数週間でプロジェクトファイルのコンフリクトを3回食らって、そのたびに焦ったので、対処方法をメモります。
Xcodeで編集できなくなるんで、最初遭遇したとき復旧不可能になったかと思って焦りました。
そもそもXcodeGenを使ってプロジェクトファイルがコンフリクトしないようにする対策もあるようなのですが、ここでは扱いません。
(XcodeGenによる新時代のiOSプロジェクト管理)
想定
git pull
したら、プロジェクトファイルがコンフリクトした装置です。
やること
git status
コンフリクトしているファイルを確認しましょう。
On branch hoge
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Changes to be committed:
new file: NotConflicted.swift
Unmerged paths:
(use "git add <file>..." to mark resolution)
both added: xxx.xcodeproj ←これ!
実際プロジェクトファイルがコンフリクトするときってファイルの追加削除が激しいときなんで、
表示はもっと激しくなると思いますが、こんな感じになるかと思います。
マージしよう
普通のファイルだったらXcode上でなおす選択肢もあるのですが、プロジェクトファイルがコンフリクトすると、
そもそもXcode上のプロジェクトが開けない状態になるので、それは無理です。
(もしXcodeで直編集できる方法あったら教えてください。
拡張子変えるとかすればできそうですが、それ以外で……)
Xcode以外のエディタ(VSCodeとか)なら、単なるファイルとして扱われるので、それで編集しちゃうのも手です。
mergetool
mergetoolを使います。
git mergetool
僕の環境だと、こんなんが開きます。
(画像: Mac で使える git mergetool をいろいろ試してみる - OpenDiff)
mergetool、設定すれば変えられるらしいのですが、
特に何もしていないと、Xcode入れたときの付属品としてついてくるこのアプリが起動するみたいです。
opendiffなのかFileMergeなのか、アプリ名がいまいちハッキリしないんで、そこはぼかします。
画面左がローカルブランチで、右がリモートブランチ、
下がMergeしようとした結果となっています。
変更箇所をポチポチたどっていき、Actionsのプルダウンから、
右を選ぶ、左を選ぶ、右/左有線で両方採用、など選べます。
いずれのアクションも不適なときは、下Windowで直接編集ができます。
その後
コンフリクトを解消したら、そのまま閉じると、
Was the merge successful? [y/n]
と表示されるので、yを押すと、Merge完了となります。
元のファイルは.origファイルとして残りますので、コミットして問題がなかったら、ゴミになるので消します。
ツール側で保存してから閉じると、この質問が出ず、.origも作られないっぽいです。
opendiff、どう?
正直使い勝手は微妙です。。。
しかし、必要最低限、という感じはします。
vimで直編集よりはマシかなあという程度。
僕は普段のコンフリクトはXcode上で確認してなおしているので、
プロジェクトファイルのときだけ使うものなので、そこまでこだわりがないので、これでやろうかなあと思っています。
Qiita見るとvimdiff入れてる人が多いっぽくて、opendiffでやっている例があまり見つからないので、敢えて書いてみました。
この方のブログ記事を見ると、他の選択肢が色々見られて良さそうです。
Mac で使える git mergetool をいろいろ試してみる - 準備編