Resolving Merge Conflicts for the Unity Game Engine
I’m working with a team of four on a Unity 3D game project over the weekends. It’s a lot of fun, but we’ve encountered problems with version control. Using Git and GitHub, we’ve faced many merge conflicts that are not easy to resolve; it’s not as simple as just deleting a section or performing a forced push:
<<<<<<< HEAD:main.scene
Painful
=======
Delete me
>>>>>>>
There are lots of unnecessary local meta files that get pushed to our repository. The solution I’ve found is not perfect, but it works:
First, open the Unity editor and go to:
Edit -> Project Settings -> Editor ->
Select "**Visible Meta files**" in the version control mode
Second, add a .gitignore
file like this:
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*
# Autogenerated VS/MD solution and project files
ExportedObj/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
# Unity3D generated meta files
*.pidb.meta
# Unity3D Generated File On Crash Reports
sysinfo.txt
# Builds
*.apk
*.unitypackage
.DS_Store
Then, commit the actual changes and run the following commands:
git rm -r --cached .
git add .
git commit -m "Fixed untracked files"
Third, Unity has a tool called UnityYAMLMerge for merging scene and prefab files. Enable this by creating a .gitconfig
file with the following:
[merge]
tool = unityyamlmerge
[mergetool "unityyamlmerge"]
trustExitCode = false
cmd = /Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
The next time a teammate clones the project, they may initially see an empty scene. However, there’s no need to panic. Simply open the saved main.scene
(assuming you have saved the scene and committed it), and everything else should work as expected. I wish Unity had built-in source control like other IDE environments. Happy coding!