Unity开发中如何使用SourceTree解决版本控制冲突
Unityでソースツリーを使ってバージョン管理する3(コンフリクト対策)
冲突与解决
1. 什么是冲突?
当多人分别修改了同一文件的同一部分时发生的「冲突」
。
为什么会发生?
例如:A将 Player.cs 中的「跳跃力」从 10 改为 15 并提交到 GitHub
在此期间,B将同一个 Player.cs 中的「跳跃力」从 10 改为 12,然后尝试拉取最新代码
此时 Git 会判断「不知道应该采用哪种修改」,从而产生冲突。在 SourceTree 中,文件旁边会显示红色标记或「Conflicted」。
2. 发生冲突时的外观(代码中)
打开发生冲突的文件时,会自动插入以下符号:
<<<<<<<HEAD
ジャンプ力 = 15; // 自分の変更(または現在のブランチ)
=======
ジャンプ力 = 12; // 相手の変更(取り込もうとした変更)
>>>>>>> 相手のコミット名
- <<<<<<< HEAD ~ ======= 为止 → 我方修改内容
- ======= ~ >>>>>>> 为止 → 对方修改内容
如果保留这些符号,Unity将无法正常运行。
必须手动修复。
3. SourceTree中的冲突解决步骤(面向初学者)
步骤① 确认存在冲突打开 SourceTree
查看“工作区”或“文件状态”
检查显示红色图标或“Conflicted”的文件
步骤② 打开文件以检查和修正内容双击发生冲突的文件(或右键 → “在资源管理器中显示”等)
使用 Visual Studio、VS Code 或记事本等打开
参照 <<<<<<< ======= >>>>>>> 符号,仅保留最终希望保留的内容
例如:若想将跳跃力设为 15
// 修正前
<<<<<<< HEAD
ジャンプ力 = 15;
ジャンプ力 = 12;
>>>>>>> 相手のコミット
// 修正後(記号を全部消す)
ジャンプ力 = 15;
也可以同时应用双方的修改(例如:跳跃力设为 15,其他参数则采用对方的值等)。
步骤③ 向 SourceTree 告知已进行修正(标记为已解决)
- 返回 SourceTree
- 选择已修正的文件
- 右键点击 → 选择 「标记为已解决」(Mark as Resolved)
(或点击顶部的「已解决」按钮)
这样即可解除冲突状态。
步骤④ 提交
- 确认文件已进入暂存区
- 编写提交信息并点击「提交」
- 根据需要「推送」到 GitHub
这样就解决完成了!
4. 常见注意事项与技巧
| 要点 | 説明 |
|---|---|
| 在 Unity 的场景或 Prefab 中容易发生 |
.unity 和 .prefab 文件内容复杂,发生冲突时很难手动修正。请尽量避免同时修改同一个文件。 |
| 文本文件易于修改 | 脚本(.cs)相对容易修复。 |
| 不确定时向对方确认 | 通过聊天询问“保留哪边的更改?”是最安全的做法。 |
| 进行备份 | 如果感到不安,请在修改前复制文件。 |
| ツールを使用する方法もある | SourceTreeには「外部マージツール」の設定機能がありますが、初心者であればまず手動修正で十分です。 |
5. コンフリクトをできるだけ減らす方法
- 作業前に必ず「プル」(最新の変更を取得)する習慣をつける
- 同じファイルを長時間編集しない(小まめにコミット&プッシュする)
- シーンやPrefabは「誰が触るか」をチームで決めておく
- 在做出重大更改之前,先联系对方告知“我现在要操作这个文件了”。
总结
- 冲突 = 对同一位置分别进行修改后发生冲突的状态
- 解决方法是“打开文件,只保留正确内容 → 标记为已解决 → 提交”
- 使用 SourceTree 几乎只需鼠标操作就能完成大部分流程
刚开始会有些紧张,但熟悉之后,遇到冲突时也能从容应对,心里想着“啊,出现冲突了”即可。
实际尝试一次(例如故意修改同一个文件进行练习)会加深理解。
场景(.unity)或预制件(.prefab)的冲突
1. 为什么场景和预制件的冲突如此棘手?
文件内容是“YAML格式”的文本,但其中写入了大量对象ID及其引用关系。
即使只是稍微移动了同一个对象,也会导致大量行发生变更。
若尝试手动修复,很难判断哪些内容应当保留,容易导致场景损坏。
因此,需要比处理脚本冲突时更加谨慎地应对。
2. 基本心态(最重要)
「不要同时让多个人编辑同一个场景或同一个预制件」
这是最有效的对策。在开始工作前,团队内应沟通确认,例如:“我现在要修改TitleScene”。
按场景分配负责人
完成重大变更后立即提交(commit)并推送(push)
开始工作前务必执行拉取(pull)
仅凭这一点,就能防止大多数冲突。
3. 发生冲突时的处理方法
根据情况选择以下方法之一。
方法① 优先保留某一方的更改(简单、适合初学者)
选择“保留自己的更改”或“保留对方的更改”。
-
SourceTree中的操作步骤:选择存在冲突的场景/预制体
-
右键单击
-
选择以下任意一项
「使用 Ours」(保留自己的更改)
「使用 Theirs」(保留对方的更改) -
“标记为已解决”
-
提交
适用场景
当一方的修改几乎只是用于测试、可以丢弃时
优先采用对方的修改,之后再重新制作自己的修改时
注意
未选择方的更改将被丢弃。如果有必要的更改,之后需要手动重新应用。
方法② 保留一方,手动重新应用另一方的更改(现实且安全)
这是团队中常用的现实方法。先通过选择“Ours”或“Theirs”保留其中一方的更改
标记为已解决并提交
在Unity中打开场景/预制件
根据记忆或与对方确认,手动重新应用丢失的更改
优点
不会强行修复损坏的文件,因此更安全
结果可靠
冲突后必须执行的操作
无论选择哪种方法,最后请务必执行以下操作。
- 在Unity中打开该场景/预制件
- 确认是否有错误输出
- 目视检查Hierarchy和Inspector的状态是否正确
- 如有必要,请在Play模式下进行运行确认
- 若无问题,则提交并推送
总结:优先级
- 本来就不进行同时编辑★★★★★
最大的预防措施 - 用 Ours / Theirs 保留其中一方★★★★
对初学者来说最简单 - 保留一方并手动重新应用★★★★
安全可靠
建议
场景和预制体的冲突,与其“发生后再修复”,不如“防患于未然”
只要在团队内制定“编辑场景时先打招呼”的规则,就能大幅减少麻烦。
来源:Qiita · Unity 开发社区 · qiita.com