跳到正文
Qiita · Unity 开发社区· 来源· kurisaka_konabe·· 4 小时前AI 评分1

Unity开发中如何使用SourceTree解决版本控制冲突

Unityでソースツリーを使ってバージョン管理する3(コンフリクト対策)

正文 · AI 翻译

冲突与解决

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 告知已进行修正(标记为已解决)

  1. 返回 SourceTree
  2. 选择已修正的文件
  3. 右键点击 → 选择 「标记为已解决」(Mark as Resolved)
    (或点击顶部的「已解决」按钮)

这样即可解除冲突状态。

步骤④ 提交

  1. 确认文件已进入暂存区
  2. 编写提交信息并点击「提交」
  3. 根据需要「推送」到 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模式下进行运行确认
  • 若无问题,则提交并推送

总结:优先级

  1. 本来就不进行同时编辑★★★★★
    最大的预防措施
  2. 用 Ours / Theirs 保留其中一方★★★★
    对初学者来说最简单
  3. 保留一方并手动重新应用★★★★
    安全可靠

建议

场景和预制体的冲突,与其“发生后再修复”,不如“防患于未然”
只要在团队内制定“编辑场景时先打招呼”的规则,就能大幅减少麻烦。

来源:Qiita · Unity 开发社区 · qiita.com