gpt4 book ai didi

Git merge : parallel identical additions are merged without conflict by including the same code block TWICE in the merged file without complaint. 为什么?

转载 作者:行者123 更新时间:2023-12-02 17:14:40 27 4
gpt4 key购买 nike

我的 Git 日志中有一段有点棘手的历史,我正试图完全理解它。

在解释提交的顺序之前,让我粘贴 Git 日志的图像(使用 SmartGit 来可视化历史记录)以用于相关文件:

git_history_later

...

git_history_earlier

显示的是与我的问题相关的 Git 历史,不相关的中间部分被剪掉了。

两名开发人员对相关文件进行了代码更改,即开发人员 1 和开发人员 2。

开发人员 1

  • 检查图片中标记为“起源/暂存”的分支(但在 check out 时也是“起源/发展”)
  • 添加一个小代码块 (见下文)
  • 提交和推送 - 此推送在
  • 上方标记为“jon-dev-test-merge”
  • 对上一次提交的代码进行简单的空白更改,并提交/推送此空白更改,标记为“jon-dev-test-merge-2”,位于
  • 上方
  • 意识到他应该在一个单独的分支上工作 ,所以重新开始并检查'origin/staging'(当时为'origin/development'),进入一个名为'jons_dev'的新分支,他将其推送到,并在origin
  • 上设置跟踪。
  • 将相同的小代码块(不包括空格更改)添加到这个新分支(蓝线)(在标记为“test-merge-sales”之前的某个时间提交)
  • 后来,看到Developer 2 对'origin/development' 分支做了改动,将'origin/development' merge 到他的'jons_dev' 分支

  • 同时...

    开发人员 2
  • 检查图片中标记为“起源/暂存”的分支(但在 check out 时也是“起源/发展”)
  • 对另一个文件进行代码更改(与上面开发人员 1 的代码更改完全无关) - 这是他在本地开发机器上的工作副本
  • 将开发人员 1 对“origin/development”分支的代码更改 pull 到他的本地机器上,并 merge 到仅本地分支/工作副本中; merge 成功而没有冲突。请注意,我们没有看到开发人员 2 merge 到他的本地分支(因为他没有将该分支推到原点),而只有从他的本地分支 merge (见下一个要点)回到“原点/开发” '当时的分行。
  • 从他本地机器上的原点 merge 到跟踪的开发分支,并将 merge 推回到原点 - 标记为“vladimir-test-merge”,上面

  • 到现在为止还挺好。

    这是我的问题。

    在理解上述事件顺序的过程中,我注意到了一些奇怪的事情——'origin/development' 分支没有变化 对于相关文件 需要 merge 到标记为“起源/发展”的 merge 中 - 其解释原来是这个文件中的解释, 因此,对这个文件的相同更改(不包括空格)同时出现在两个文件 中。以便只需要来自“jons_dev”分支的更改(这就是 merge 的执行方式)。

    但是,我从 merge 中注意到一些事情,涉及 Git merge 和确定冲突的方法,我无法解释。

    为了以最简单的方式为我的问题演示该问题,我首先创建了屏幕截图中指示的测试分支 - 'test-merge-sales' 和 'jon-dev-test-merge'/'jon-dev-test-merge -2'。然后我检查了分支 'test-merge-sales' 并执行了两个单独的 merge 到这个分支(取消两个测试之间的 merge )。

    这两次 merge 的相关结果如下所示。 (附录:由于问题下面的评论,第二个 merge 场景很容易解释。但是,第一个 merge 场景仍然是一个问题。)

    (0) 基础文件

    在展示两次 merge 的 3 路截图之前,这里是文件 相关部分的截图。因为它存在于 'origin/staging' 分支之前分支发散 :

    基础文件:
    pre-branch-file

    该图像显示了在任一开发人员进行任何更改之前,该文件对两位开发人员的查找方式。

    还有一些注释,它们准确地解释了每个开发人员为达到下面案例 (1) 中所示的预 merge 状态而进行了哪些代码更改。

    从评论中可以看出,Developer 1 添加了一个函数 - print_customer_part_order_history ,然后是第二个函数, print_sales_analysis_page , 到文件中的给定位置。同时,另一个分支添加了一个函数 - print_customer_part_order_history - 在文件中完全相同的位置。代码是相同的,包括空格。

    这是文件进入 merge 案例 (1) 的状态,如下所示。

    (1) 从'jon-dev-test-merge' merge 到'test-merge-sales'分支

    注意:这个 merge 场景是我的主要问题。由于问题下方的评论,与其他 merge 场景(#2,下面)相关的问题已经得到回答。

    本次 merge 没有导致冲突 .打开 merge 文件的差异查看器,以下是相关( merge )行的屏幕截图:

    merge_from_jon-dev-test-merge

    (点击此 link to full-size image )

    请注意,Git 通过包含两个相同的函数(并行添加)“print_customer_part_order_history()”来 merge 文件 - 没有 merge 冲突 . (这是开发人员 1 并行添加到两个分支的代码片段。)因此,此函数在 merge 代码中出现了两次。

    注意:'test-merge-sales' 分支在两个分支的突出显示代码块中具有相同的空格 - 前导空格。

    问题 1:为什么 Git 决定不存在 merge 冲突?在文件的同一位置并行添加了两个代码块。即使代码块相同,我认为这应该是 merge 冲突。

    (2) 从'jon-dev-test-merge-2' merge 到'test-merge-sales'分支

    注意:由于此问题下方的评论,与此 merge 方案相关的问题已得到解答。

    merge_from_jon-dev-test-merge-2.jpg

    (点击此 link to full-size image )

    merge 代码的唯一区别是 Developer 1 将前导空格更改为制表符。 然而,在这种情况下,只有空格不同,Git 已经声明存在 merge 冲突 .

    问题 2:为什么 - 只有空格不同 - Git 会决定在一种情况下不存在 merge 冲突,而在另一种情况下存在 merge 冲突?

    上面确定了我的两个问题,关于 Git 如何处理 merge 和 merge 冲突。

    谢谢!

    附录
    我添加了一个额外的截图 - 文件的相关文本 之前 两个分支分开 - 连同描述性文本,在名为“ (0) Base File ”的部分中。谢谢!

    最佳答案

    很简单:在做 merge 时, git 分析在两个大小上都发生变化的行:

  • 如果更改相距不到 2 行(引用即将推出),这将产生冲突,因为更改很可能是同一件事;
  • 如果更改相距超过 2 行,则两侧的内容被视为两个不同的事物,添加的内容 未分析 ,刚刚添加到生成的文件中。

  • 由于 LHS 在 line 79 上添加了该功能并且 RHS 在 line 69 上添加了它git 认为它是不同的内容,因为它不只是相隔几行。

    将来如何避免这种情况?
  • 前往 diff在两个分支之间,如果您仔细阅读差异然后在 merge 中编辑它,这将是可见的;
  • 在您的团队内进行更多沟通(如果可能),两个开发人员在两个不同的分支中编写完全相同的功能是否正常?


  • 来自 git merge doc(重点是我的)

    HOW CONFLICTS ARE PRESENTED

    During a merge, the working tree files are updated to reflect the result of the merge. Among the changes made to the common ancestor’s version, non-overlapping ones (that is, you changed an area of the file while the other side left that area intact, or vice versa) are incorporated in the final result verbatim. When both sides made changes to the same area, however, Git cannot randomly pick one side over the other, and asks you to resolve it by leaving what both sides did to that area.

    关于Git merge : parallel identical additions are merged without conflict by including the same code block TWICE in the merged file without complaint. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054478/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com