How to merge conflicts (file project.pbxproj) in Xcode use svn?

IphoneSvnXcodeConflict

Iphone Problem Overview


There are two members in our team. We use Xcode's SCM (use SVN) to manger our source code files.
We all add files to our Xcode project. He has committed to SVN server. When I update, Xcode find there has conflicts in project.pbxproj file. Then I select quit Xcode and manually merge the conflicts. Then I start to edit my project.pbxproj, merge our changes. Actually I don't know how Xcode manage files, I just add some text that my project.pbxproj file did't have. When I finish, my project can't open. I guess that because the project.pbxproj file can't be edit by manual.

So, I want to know, when you find this problem, the project.pbxproj file have conflicts, how to solve it?

Thank you!

Iphone Solutions


Solution 1 - Iphone

I use git but we see the same issue - if two people add files there's a merge conflict.

Usually the editing is very easy though. Simply go into the project.pbxproj file with a text editor, and look for the merge conflict section - usually this is marked by something like :

>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<

In 99% of Xcode project merge conflict cases, you simply want to accept both sides of the merge (because two people added different files) - so you would simply delete the merge markers, in the above case that would end up like:

Stuff 1
Stuff 2

Like I said, this works great in MOST cases. If Xcode will not read the project file when you are done, just take the most recent un-merged version and manually add your files again.

Solution 2 - Iphone

Unfortunately, there's not much you can do except to make the changes manually in one check out and then check-in the newly "merged" project.

Solution 3 - Iphone

This solution is only for git, but you can add a .gitattributes file to your project then within that file add the following line:

*.pbxproj merge=union

This will tell git to keep both sides of the merge which will be what you want the vast majority of the time.

Solution 4 - Iphone

To manually solve the merge conflicts, check the UUID of each conflicting item.

Example:

<<<<<<< HEAD
    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
=======
    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };
>>>>>>> branch_to_merge

Check each UUID:

  • If it occurs in both versions, remove it in one version: ExistingFile.swift
  • If it does not occur on the comparing branch, keep it: NewFileA.swift and NewFileB.swift
  • If it is not referenced anywhere else in the file, i.e. you can only find one occurrence in the whole project.pbxproj file, I would assume it is an artefact and safe to delete it.

The result would be:

    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
    4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };

Note: I don't recommend adding *.pbxproj merge=union to the .gitattribues file to basically ignore merge conflicts because a conflicting merge should alway be checked manually unless there is a sophisticated script doing that for you.

Solution 5 - Iphone

I was looking for a straightforward solution to this problem when I came across this other question/answer:

https://stackoverflow.com/a/14180388/307217

I was completely blown away by how simple this solution is, I was trying to merge in a disparate feature branch which was almost 200 revisions behind the trunk, XCode and Mercurial were not being happy campers about it. I tried manually merging the pbxproj file (which had over 100 conflicts) 8 times before trying this solution.

Basically the solution is as such (assuming you use Mercurial, because it's awesome):

  1. Attempt your merge in mercurial:

     hg update FEATURE_BRANCH
     hg merge default
     *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
    
  2. Open Xcode

  3. From the top toolbar, select Xcode->Open Developer Tool->FileMerge

  4. On the left, open your conflicted 'project.pbxproj' file (the one with merge conflict markup in it)

  5. On the right side, open your 'project.pbxproj.orig'

  6. Select File->Save Merge and save over the 'project.pbxproj' file

  7. Then back at the command line:

     hg resolve -m ProjectName.xcodeproj/project.pbxproj
     *merge any other broken files*
     hg commit -m "manually merged with trunk"
    
  8. Eat Cake Because You Are Done

Solution 6 - Iphone

So far the best visual merge tool I have used for pbx files is Visual Studio Code's merge tool. I open the pbx file in Code app and fix conflicts then open XCode again.

Solution 7 - Iphone

Sometimes one or few files could be recreated (for example ManagedObjects) in different branches, so when you'll merge there may be two declarations for one file in one block. In this case you should delete one of the declarations.

Solution 8 - Iphone

As stated above the most common way of handling the conflicts is to

  1. accept "everything"
  2. re-import the files into the project

I Wrote a bash-script that takes care of (1) above.

Note that this will only solve the most common case of merge conflicts!

#!/bin/bash
#
#
#
if [ $# -eq 0 ]
 then
    echo "File must be provided as argument, darnit!"
    exit 1
fi

if [ $# -eq 2 ]
 then
    echo "only ONE File must be provided as argument, darnit!"
    exit 1
fi


echo "Will remove lines from file:" $1
grep -v "<<<<<" $1  | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp $1
echo "Done removing lines from file:" $1

Solution 9 - Iphone

I happened to encounter this tricky problem.

Instead of manually dealing with these conflicts, you can try this.
Suppose you are on feature branch.

  1. Git checkout master.

  2. Copy content in project.pbxproj

  3. Git checkout to your feature branch, and paste it.(Override the current content in project.pbxproj)

  4. Run

     react-native link
    

Solution 10 - Iphone

You can open it on VSCODE and fix the conflicting merge there. look for some colored annotations on the IDE or look for <<< >>> in the text search.

Solution 11 - Iphone

I founded a tool "xUnique" https://github.com/truebit/xUnique, it works!

Solution 12 - Iphone

I know that 90 percent of conflicts are clear and you can accept both changes in conflicts so you do not need to be worry you will resolve it if you will be patient the way I found that use tools like xUnique that will help you a lot

Solution 13 - Iphone

The best thing to do might be to simply accept either your version or his version in its entirety, without trying to combine the two. Also, consider whether the file in question is something that should be in the repository at all; it may be more appropriate to let each person have their own version of it.

Check out the documentation on how to resolve conflicts.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionvcLweiView Question on Stackoverflow
Solution 1 - IphoneKendall Helmstetter GelnerView Answer on Stackoverflow
Solution 2 - IphoneBarry WarkView Answer on Stackoverflow
Solution 3 - IphonemmilleruvaView Answer on Stackoverflow
Solution 4 - IphoneManuelView Answer on Stackoverflow
Solution 5 - IphoneG. ShearerView Answer on Stackoverflow
Solution 6 - IphoneAli ErsözView Answer on Stackoverflow
Solution 7 - IphonerealbusymanView Answer on Stackoverflow
Solution 8 - IphonetommysView Answer on Stackoverflow
Solution 9 - IphonemagentaqinView Answer on Stackoverflow
Solution 10 - IphoneGuilherme ValloneView Answer on Stackoverflow
Solution 11 - IphonelighterView Answer on Stackoverflow
Solution 12 - Iphonejamal zareView Answer on Stackoverflow
Solution 13 - IphoneMichael HacknerView Answer on Stackoverflow