友人と1つのマスターブランチを持つgitベースのプロジェクトがあります。彼はいくつかのファイルにいくつかの変更を加えました。私は他のいくつかのファイルに変更を加えました。おそらく、同じファイルのいくつかに変更を加える可能性があります。彼はすべての変更をコミットしてレポにプッシュしました。それから私は行って自分の変更をコミットし、彼の変更をプルしようとしました。私はいくつかの競合を提示されましたが、それらは私が変更しなかったファイルであったため、彼の変更を支持してほとんど解決しました。次に、プッシュしようとすると、致命的でした。マージ中に部分的なコミットを実行できません。
これらは私が得る画面です。
私に何ができる?プロジェクトは正常に実行されますが、ゲームのメインメニューに、他のいくつかの画像を除いて、彼が取り組んでいた画像と彼が取り組んだクラスファイルであるはずの画像が表示されない点が異なります。
Xcodeにはxcuserdataファイルに問題があり、変更を破棄して再コミットする必要がありました
これは一般的なイライラする状況です。
mv .git/MERGE_HEAD .git/MERGE_HEAD_STUCK
と入力してマージヘッドを脇に移動しますあなたの問題はすでに半分解決されているはずです、場合によってはあなたは主催者から引っ張る必要があります:
その後、XcodeからGitを再び使用できるようになります。おそらく、いくつかのマージの競合を解決する必要がありますが、少なくともこれはXcodeの下にあり、ターミナルではありません。
注:考慮してください gitリポジトリから.DS_Storesを削除する
すべてのマージの競合が解決されるまで、コミットすることはできません。あなたが説明したことに基づいて、あなたが両方とも変更したファイルがあります。それらはあなたが解決しなければならない対立です。
Xcodeの競合を解決したことはありません。ターミナルアプリからいつでも競合を解決できます。ターミナルにアクセスし、Xcodeコマンドラインツールをインストールしたと仮定して、次のことを試してください。
git mergetool
git commit
これにより、編集内容を選択できるFileMergeウィンドウがポップアップ表示されます。ターミナルからのもう1つのオプションは、彼の変更を受け入れるだけで競合を解決することです。これはコードを壊しますが、戻って修正することができます。そのために:
git status
git checkout --theirs -- /path/to/a/conflicted/file ...
git add -- /path/to/a/conflicted/file ...
git commit
次に、ファイルを編集して機能を修正します。すべての競合が解決されると、Xcodeでコミットできるようになります。
ターミナルを開き、以下を利用します。
競合しているファイルを見つけるには:git status
マージして競合を修正するにはgit mergetool
追跡されていないファイルを追加する必要がある場合があります:git add .
最後に変更をコミットしますgit commit
XCodeに問題がある場合は、AppCode(必要に応じて試用版)に戻し、最上位のプロジェクトフォルダーからコミットを実行します。
AppCodeはマージシナリオを検出し、部分マージの問題を整理します。同様に、AppCodeで分類できない場合は、Githubデスクトップを使用します。これがすべて失敗した場合にのみ、低レベルのコマンドに戻ります。
Xcodeのソース管理のみを使用して、まったく異なるアプローチでこれを解決しました。
背景:別のチームが(Beanstalkを介して)リモートGitリポジトリに変更をプッシュしました。私の側では、.xcodeprojファイルは別のディレクトリにあり、変更は行われませんでした。後でコミットしようとすると、XcodeでTreeConflictエラーが発生しました。
ツリーの競合のスクリーンショット
Xcodeを使用して修正することはほぼ不可能であるため、.xcodeprojファイルをGitサーバーからダウンロードしたバージョンに置き換えました。結果... Xcodeプロジェクトはクリアされたように見えましたが、破損したプルからのすべての更新は、私が行った変更として表示され、コミットのためにステージングされました。 これらすべてのModと追加されたファイルを見てください しかし、コミットしようとすると、ここで説明する同じ「致命的:マージ中に部分的なコミットを実行できません」エラーが発生しました。
これが私が問題を解決した方法です...(今、私は新人プログラマーであることを理解しているので、理解が不足している可能性があります...しかし私の無知は私にこれを行う別の方法を見つけるように導きました。)セカンダリブランチに分岐し、そのブランチに切り替えます。次に、作業コピーを作成し、元のプロジェクトディレクトリの外にあるその作業コピーにディレクトリを配置しました。 (これが必要かどうかはわかりませんが、他のトラブルシューティング手法を読んだときに行ったことです。)次に、ブランチをマスターに切り替えました。そこで、ステージングされたファイル(コミットへの変更)がすべてなくなっていることに気付きました。すべてのファイルが相手によって行われた最新の変更に更新されたことを確認するために、ThirdBranchという新しいブランチを作成しました。これは、すべてのファイルを複製し、それをGitサーバーにプッシュして、Beanstalkにマスターブランチのサーバーバージョンを比較させました。プッシュしたばかりのThirdBrachブランチ(行ごと)で、相手によるすべての変更がXcodeに存在していました。これは、私のマスターリポジトリとGitマスターリポジトリが同じであることを意味し、Xcodeのみを使用して問題を解決したことを確認します。
私が今説明したことを超えて、どのように私に尋ねないでください...そして確かに私が省略したギャップを埋めます。私はこれが初めてで、すべてを理解しているわけではありません。経験豊富なプログラマーが、無関係な情報を関連する情報から分離して、この手法をより明確に再現できるかもしれません。これが、私がこれを投稿する理由の1つです。