Unity + Bitbucket + SourceTreeで数名で別々のシーンを作成後マージする

More than 1 year has passed since last update.

Unityで複数人で1つのシーンを作業する記事はたまに見かけますが、1人1つのシーンを担当するような記事はあまり見ません。

今回、Git管理でプログラマー数名でそれぞれ別々のシーンを作成後、1つにマージする機会がありましたのでメモしておきます。

はじめ、人数分のブランチをきってシーン作成後、Bitbucket上でプルリクエストを出してmasterブランチにマージしようとしていたのですがマージチェックがいつまでも完了しませんでした。

どうやらローカルでシーンのマージをした後、リモートにプッシュするのが正しいやり方のようです。

以下はそのやり方です。

自信無いので間違ってるとか、よりスマートな方法などがあればぜひご教示お願いします。

※環境:MacOS10.13.4, Unity2017.4.3f1, Bitbucket, SourceTree2.7.3


UnityYAMLMergeをSourceTreeのマージツールとして設定

Sourcetree -> 環境設定 -> Diff

sourcetree_setting.png

Diffコマンド、Mergeコマンド共に

/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge

引数共に

merge -p $BASE $REMOTE $LOCAL $MERGED

を設定する


p4mergeをmergespecfile.txtに指定

ここのページのDLリンクからDLします。Registerは特にしません。p4mergeのみチェックしDLします。

そして

/Applications/Unity/Unity.app/Contents/Tools/mergespecfile.txt

を開きます。

下の画像のように、unity use句とprefab use句、そしてApple File Mergeのところに変更をかけます。

mergespecificfile.png

それでは新規にUnityプロジェクトを作っていきます


BitbucketでUnityプロジェクトを作成し、ブランチをきる

まず下の画像のように、Unity新規プロジェクトでmain(scene1)を作ってmasterにプッシュします。

そしてそのmasterを親とするブランチscene2とscene3を切ります。

ブランチscene2にはこれからscene2を追加、

ブランチscene3にはこれからscene3を追加しようというわけです。

この時にUnityの設定で、Editor -> Project Setting -> EditorでVersion ControlをVisible Meta File, Asset SerializationをForce Textにします。こうするとprefabやsceneといったバイナリフォーマットのファイルをテキストで確認する事ができるようになるようです

branches.png

unity_setting.png


各ブランチで担当シーンを実装->コミット->プッシュ

(SS撮り忘れちゃいました...)scene2実装担当者は、Sourcetreeのブランチでリモート->scene2をダブルクリックでブランチscene2をローカルにチェックアウトします。

* リモートブランチの表示更新がされていない場合は、masterブランチで一度プルをかけた方がいいかもしれません

同じく、scene3実装担当者は、Sourcetreeのブランチでリモート->scene3をダブルクリックでブランチscene3をローカルにチェックアウトします。そしてUnityを開いてシーンの実装作業をしていきます。下の画像はscene3の場合です

unity_scene3.png

Unityで担当シーンを作成したら、Sourcetreeでコミット->プッシュします

commit_scene3.png

ここまでやると、Bitbucket上はこのような状態になります。枝分かれしちゃってますのでこれをマージしたいわけです。

commits.png


ローカルでブランチをマージ

今回はscene2実装担当者がリモートのscene3ブランチをローカルにプルしてマージする事にします。

checkout_scene3_to_scene2.png

マージ先がscene2,マージ元がscene3なので、現在の作業リポジトリをscene2に切り替えます。

sourcetree_scene2_scene3.png

マージ->ログからマージ->scene3選択->該当コミット選択->OK

sourcetree_merge.png


コンフリクトを解決する

Uncommitted Changeを選ぶと、下の画像のように、!マーク(コンフリクト有)のファイルがある事がわかります。1つ1つ解消していきます。まずassetdatabase3はマージツールで開く事ができないので、「自分の変更を使って解決」か「相手の変更を使って解決」かどちらかで解決します。

conflict_assetdatabase3.png

CurrentLayoutとLastSceneSetupについてはp4mergeで開けるので「外部マージツールを起動」を選択します。

見方は左から「マージ先の内容」「共通の親の内容」「マージ元の内容」

下が「コンフリクト解決後の内容」です

conflict_currentlayout.png

conflict_lastscenesetup.png


リモートにプッシュ

下の図のようにコンフリクトが全て消えたら、Unityで開いてシーンのマージが出来ているか確認します。場合によってはDefaultLayoutの再設定が促されたり、Rebuildが必要になるかもしれません。

sourcetree_after_merged.png

unity_merged_scenes.png

問題ない事が確認出来たら、リモートにプッシュします。この時点でマスターにまでプッシュしてしまうかどうかは運用状況に寄るかと思います。

push_after_merged.png

Bitbucketでも下の図のように確認出来ました

bitbucket_after_merged.png

以上です。

ただ単にシーンを追加しただけなので、実際はもっと色々大変な事があると思います...

参考URL:

http://tsubakit1.hateblo.jp/entry/2015/05/14/040852

https://muzigram.muzigen.net/2017/06/unitysceneprefabunityyamlmerge.html

http://labs.gree.jp/blog/2015/04/13836/

http://wadahiro.hatenablog.com/entry/20111115/1321372150

Windowsならp4mergeじゃなくMeldでもいいと思います

https://www.youtube.com/watch?v=EQB-N-ClO9g

*あと、この記事用に話を簡単にする為にそれっぽくブランチを切りましたが、GitFlowを織り交ぜてちゃんとした方がより良い運用だと思いました

https://qiita.com/Sansuusetto/items/90b602f25f49016188d3