首页 > 解决方案 > 为什么冲突标记是以它们的方式创建的,为什么合并会以这种方式工作?

问题描述

我一直在学习 git,虽然我认为我对解决冲突和合并的工作原理有所了解,但我想知道为什么它的完成方式(至少在默认情况下,简单地使用时git merge)是明智的。

在某些情况下,整个合并将自动完成,但我不太清楚这是正确的做法。例如,假设我有一个基本提交base和两个“子”提交A, Bbase如果向定义的A某个函数添加一些功能,同时创建一个假设以某种方式运行的函数,它肯定看起来可能会失败——但 git merge 很可能会自动完成。即使它不是自动完成的,也不会制作任何类型的冲突标记。fbaseBgfg

甚至像添加文件这样的东西也不是完全安全的。新添加的文件可能包含对现有文件进行假设的功能。我能想到一个遍历文件夹中所有文件并进行一些解析的脚本 - 它可能会起作用,但是一个具有无法正确解析的奇怪字符的新文件会导致问题。

但也许这些类型的问题可以以某种方式分类?也许可以说“正确”合并的主要目标是程序仍然可以正确编译,但不能保证它会正常运行或给出合理的结果。我不是一个经验丰富的程序员,我什至不知道如何正确定义一个“正确”的程序。

//

无论如何,我真的不明白为什么合并是按原样完成的,以及为什么我可能只依赖运行 agit merge并且只通过合并冲突标记。也许在某种特定类型的语言中,但总的来说,这对我来说没有意义。我认为要使合并有意义,您应该粗略地进行某种类型的递归检查 - 本质上,如果您在一个提交中有一个新函数,您应该检查它的所有依赖关系以查看另一个提交中的任何修改。忽略这是否可行(我对此表示怀疑),我可能会遗漏一些东西,并且可能不需要这样的递归检查。

我会很感激某种类型的深入解释,说明它的完成方式背后的推理是什么,以及为什么它是有意义的。我已经进行了一些谷歌搜索,但我不确定这个主题被称为什么 - 我非常感谢参考一些深入的解释,以更正式和精确的方式处理这个主题。

标签: gitmerge

解决方案


的目的git merge是把这些文本变化,尽可能地与那些文本变化结合起来。

如果这些文本更改的语义不兼容,那么您一开始就不应该这样做git merge。作为程序员,这是你的工作,以确保你所做的事情是有意义的。如果您有良好的测试套件,他们的工作就是向您表明合并破坏了某些东西。

但就 Git 而言,它会按照你的要求进行,并且它正在正确地执行(大多数时候)。


推荐阅读