开发者工具·文本比较
双向差异与三向合并:为什么比较与合并不同
· 背景
文本差异 合并冲突 版本控制
解释比较两个版本和合并两个共享共同祖先的版本之间的区别,以及为什么存在冲突标记。
两个人编辑了同一个文件:现在怎么办? — 当双方都发生变化时,打开两个版本比较的限制
当两个人编辑一个文件时,比较他们的最终状态会显示差异,但不会显示祖先。双向差异缺乏判断哪一方更改了特定原始行所需的共同基础。它可以支持调查,但不能做出合并决定。
ToolAcre 恰好接受两个名为 Original 和 Changed 的字符串。交换视角;它不添加历史记录。任何需要基础的工作流程,我们的和他们的都必须通过单独的比较或使用真正的三向合并引擎来提供这些状态。
双向差异回答一个问题 - 重申比较告诉你什么不同,而不是哪一方应该获胜
双向比较可以回答在选定的大小写和空白选项下哪些有序行有所不同。行相等、删除或添加。该结果中没有任何内容表明一方是更新的、权威的或正确的,也没有任何操作能够选出获胜者。
当双方编辑同一区域时,此限制很重要。仅出现在左侧的行可能是有价值的新更改,而不是过时的删除。如果没有基础证据,方向标签描述的是比较视角,而不是发展年表。
共同祖先改变了一切——解释了基础版本如何让合并工具区分一方的更改和另一方的更改
共同祖先允许合并系统比较从基到左和从基到右。如果只有一个后代改变了一个区域,那么这种改变可能会干净地结合起来;如果两者都进行不兼容的编辑,系统可能会出现冲突以供人工解决。
ToolAcre 没有第三个输入,也没有合并算法。您可以粘贴基础和一个分支,记录行,然后对另一分支重复此操作。该手动分析有助于理解,但不会重新创建版本控制的所有放置和冲突规则。
解码冲突标记 — 解释 <<<<<<<、======= 和 >>>>>>>> 部分以及它们之间的内容
冲突标记(例如尖括号块)一旦粘贴到此处,即为文字文本。文本差异可以将标记的文件与建议的解决方案进行比较,但它不会将部分解析为我们的、基础的或他们的。它不会删除标记或选择内容。
解决权威存储库中的冲突,其中文件名、祖先和测试仍然可用。仅当材料适合粘贴时才使用浏览器工具进行小的措辞检查。视觉上干净的结果并不能证明合并的程序行为正确。
工作示例:与一个干净的块和一个冲突的合并 - 遍历基础、两次编辑和结果输出
从基线 `color=blue` 和 `limit=10` 开始。一根树枝变色;另一个改变限制。基到分支的比较揭示了独立的行,并且合并可以合理地保留这两者。如果两者以不同的方式更改相同的限制,则文本冲突需要做出策略决定。
两个分支之间的双向比较显示两行不同,但无法推断出共享的起始值。这个缺失的事实正是比较不是合并的原因。将基础添加到推理中,然后在实际系统中测试所选的组合状态。
双向比较仍然有帮助的地方 - 描述将每一侧与基础进行比较,或根据预期检查合并结果
双向 diff 在冲突解决后仍然有用。将合并的摘录与每个分支进行比较,以确认预期的贡献得以保留,或者与预期的手写状态进行比较。当空格或大小写会影响语言时,请关闭规范化。
下载的补丁状流可以记录每次检查,但不能应用或验证合并。原始行号是每个粘贴状态的本地行号,并且可能与相邻编辑后的存储库位置不同。
这不包括什么 — ToolAcre 的文本比较比较两个文本;它不执行合并,并且本文不涉及变基策略
ToolAcre 不执行合并、变基、冲突归因或提交历史分析。它没有移动块标签,也没有语义理解。这些是双输入线比较器的明显后果,而不是隐藏在其他地方的缺失按钮。
本文也没有规定分支策略。团队应该遵循他们的存储库控制、代码所有权和测试门。浏览器比较是一个辅助检查界面,而不是替代的源代码控制系统。
要点:通过 diff 来理解,通过合并来决定 — 总结了区别以及浏览器比较如何适合手动解决冲突
理解文本的差异; merge 来决定组合状态。第一个可以与 ToolAcre 成对重复,而第二个则需要祖先、策略和验证。将这些动词分开可以防止清晰的行显示被误认为是安全集成。
解决冲突后,在实际项目中运行语法检查、测试和域审查。文本协议对于许多合并来说是必要的,但对于行为来说却远远不够。一旦相关行差异可见,浏览器的角色就结束了。