git - 为什么冲突标记是以它们的方式创建的,为什么合并会以这种方式工作?
问题描述
我一直在学习 git,虽然我认为我对解决冲突和合并的工作原理有所了解,但我想知道为什么它的完成方式(至少在默认情况下,简单地使用时git merge
)是明智的。
在某些情况下,整个合并将自动完成,但我不太清楚这是正确的做法。例如,假设我有一个基本提交base
和两个“子”提交A, B
。base
如果向定义的A
某个函数添加一些功能,同时创建一个假设以某种方式运行的函数,它肯定看起来可能会失败——但 git merge 很可能会自动完成。即使它不是自动完成的,也不会制作任何类型的冲突标记。f
base
B
g
f
g
甚至像添加文件这样的东西也不是完全安全的。新添加的文件可能包含对现有文件进行假设的功能。我能想到一个遍历文件夹中所有文件并进行一些解析的脚本 - 它可能会起作用,但是一个具有无法正确解析的奇怪字符的新文件会导致问题。
但也许这些类型的问题可以以某种方式分类?也许可以说“正确”合并的主要目标是程序仍然可以正确编译,但不能保证它会正常运行或给出合理的结果。我不是一个经验丰富的程序员,我什至不知道如何正确定义一个“正确”的程序。
//
无论如何,我真的不明白为什么合并是按原样完成的,以及为什么我可能只依赖运行 agit merge
并且只通过合并冲突标记。也许在某种特定类型的语言中,但总的来说,这对我来说没有意义。我认为要使合并有意义,您应该粗略地进行某种类型的递归检查 - 本质上,如果您在一个提交中有一个新函数,您应该检查它的所有依赖关系以查看另一个提交中的任何修改。忽略这是否可行(我对此表示怀疑),我可能会遗漏一些东西,并且可能不需要这样的递归检查。
我会很感激某种类型的深入解释,说明它的完成方式背后的推理是什么,以及为什么它是有意义的。我已经进行了一些谷歌搜索,但我不确定这个主题被称为什么 - 我非常感谢参考一些深入的解释,以更正式和精确的方式处理这个主题。
解决方案
的目的git merge
是把这些文本变化,尽可能地与那些文本变化结合起来。
如果这些文本更改的语义不兼容,那么您一开始就不应该这样做git merge
。作为程序员,这是你的工作,以确保你所做的事情是有意义的。如果您有良好的测试套件,他们的工作就是向您表明合并破坏了某些东西。
但就 Git 而言,它会按照你的要求进行,并且它正在正确地执行(大多数时候)。
推荐阅读
- c# - 如何在 ASP.NET MVC 中使用 moq 模拟 HttpPostedFileBase
- python - 在音频文件中制作与python重叠的块
- java - Java从一行读取多个变量,但如何终止使用一个变量?
- javascript - CesiumJS:如何挤出“LineString”GeoJSON 数据?
- debugging - 实现抽象数据类型时的调试
- r - 在 SF 多边形中绘制箭头
- c# - Blazor 中服务器和客户端的通用 URL
- git - 如何使用脚本识别陈旧的 git 分支
- spring-data - 如何在 Spring Data MongoRepository 中构建搜索端点
- mysql - 不小心删除了mysql-server