こんにちは、Unityエンジニアのオオバです。
Unityで作業して作業内容をSourcetreeからGitHubにプッシュできない事ありませんか。もしかすると、他の人と 同じタイミングで同じ画像を編集 したのかもしれません。
作業が被ることを「コンフリクト」とよびます。コンフリクトするとGitHubに作業をアップロードできないのです。そこで本記事は 作業がかぶって途方にくれている方 に向けて、具体的な解決方法を解説します。
コンフリクトの解決方法はどちらかの作業を捨てる
結論を簡単にまとめます。
①「コンフリクト」状態ではマージできない
②どちらかの作業を捨てる
③作業前の最新化、チーム内での連携は重要
プログラムのようなテキストファイルの場合、コンフリクトしてもそこまで問題にはなりませんが、画像やPrefabは致命的です。画像の編集作業がコンフリクトするとテキストファイルのように 解決できません 。結論、どちらかの作業を捨てるしかありません。
コンフリクトすると焦ってしまい、作業効率を下げる原因になりがちですが事前に知っていれば対処できます。この記事は コンフリクトを解決する具体的な方法 をSourcetreeを使って紹介します。ぜひ最後まで読んでみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
コンフリクトはどういうときに起きる?
まずはコンフリクトする状況を理解しましょう。冒頭解説のとおりコンフリクトとは他人と作業の重複です。具体的には同じファイルを同じタイミングで編集してしまった状態です。
AさんとBさんの画像修正を例に解説します。
Aさんは「work_a」ブランチ、Bさんは「work_b」ブランチを作りました。両者は同時に「image.png」を編集したとします(上図)。
ここで、まずAさんは「work_a」ブランチにコミットし、プッシュしてマージされました(上図)。
この後、Bさんは遅れてコミットして、プッシュするのですが、 Aさんの作業を取り込む前にimage.pngを編集したのです。
「work_b」をコミット&プッシュしてプルリク作成まで進めます。
コンフリクトしているため、プルリク作成時の表示が変化します(↓下図参照)。
- ①マージする前にコンフリクトを解決する必要がある
- ②コンフリクトしたファイル
コンフリクトしているファイルは image.png です。これがコンフリクトした状態です。 同タイミングで同じ画像ファイルを編集 すると起きます。
コンフリクトの解決方法
ここからコンフリクトの解決方法を解説します。結論から話すと「作業の打ち消し」です。つまりなかったことにするのです。いくら時間をかけて良いものを作ったとしてもコンフリクトは無にします。この無にする作業をしないと前に進めないため、ドライに進めていきましょう。
まずは自分(Bさん)の 環境を最新化 します。最新化はプルでしたね。
Sourcetreeのプルをクリック。
プルするリモートのブランチ を mainブランチ にします。これでmainブランチの内容がBさんのブランチ(work_b)に取り込まれます。
ここで マージの競合 というダイアログが登場します。OKをクリック。
すると、左側のラインが灰色になりましたよね。灰色のラインは「コンフリクト状態した」というサインです。「Uncommitted changes」を選択しましょう。
するとビックリマークのついたファイルが登場します。ビックリマークがコンフリクトしているファイルの証です。
コンフリクトした image.png
を解決していきます。
- ①image.pngを右クリック
- ②競合を解決にカーソルを合わせる
ここから2つの選択肢が現れます。 自分、または相手どちらの作業を残すかということです。
コンフリクト解決パターンA.自分の作業の削除
相手(Aさん)の作業を残す場合です。つまり自分(Bさん)の作業を削除します。
競合を解決 > 相手の変更内容で解決
をクリック。 OK ボタンをクリックすると、自分(Bさん)の作業を打ち消して、Aさんの作業を採用します。
コンフリクト解決パターンB.相手の作業の削除
自分(Bさん)の作業を残す場合です。つまり相手(Aさん)の作業を削除します。
競合を解決 > 自身の変更内容で解決
をクリック。 OK ボタンをクリックすると完了です。
コンフリクトの解決
このように左のグレーの線がなくなりました。つまりコンフリクトが解決したということです。パターンA、Bどちらを選んでもここからの作業は同じです。
コミットして作業環境の最新化は完了
コンフリクトの解決を含めた内容をコミットして、初めて 自分の作業環境は最新化 されます。
いつもどおりコミットをクリック。
すると作業内容(コミットメッセージ)になにやら記載があります。 コンフリクトを解決したメッセージ が自動で挿入されているだけなので無視して大丈夫です。そのまま コミット ボタンをクリック。
すると「origin/master」ブランチが「workb」ブランチに取り込まれました。これでようやく作業環境が最新化されました。つまり、 コンフリクトしたあとのプルがここで完了した_ ということです。
プッシュボタン をクリックします。
「workb」ブランチの作業内容をアップロードします。 _OK ボタンをクリック。
GitHubのページを見てみましょう。このようにいつもの平和な画面が表示されました。
まとめ : Sourcetreeでコンフリクトを解決する方法
記事の内容を簡単にまとめます。
- コンフリクトしたらプルして作業環境の最新化
- Sourcetreeでどちらかの作業を削除
- 相手の変更内容で解決 or 自身の変更内容で解決
こんな感じです。
コンフリクトが起きるとどうしても余計な手間が発生します。できるかぎり コンフリクトが起きない体制 が大事です。よくある方法は、ファイルをさわるまえに一声かけることです。
Slackでこんな感じで共有します。
しかし、 どうしてもコンフリクトが発生 することはあります。そのときための解決方法として本記事を参考にしていただければと思います。基本はエンジニアにお願いするケースが多いと思います。ただUIデザイナーやプランナーといったエンジニア外の職種メンバーが自身で解決できると、エンジニア的には すごいな って思います。
ぜひ 自分でコンフリクト解決 を試してみてはいかがでしょうか。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいUnityライフをお過ごしください。