Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 为什么会发生合并冲突?_Git_Github_Version Control_Merge - Fatal编程技术网

Git 为什么会发生合并冲突?

Git 为什么会发生合并冲突?,git,github,version-control,merge,Git,Github,Version Control,Merge,例如: 我有一个总支 我创建一个文件file.txt,然后在其中写入Master branch,然后提交它 我创建了另一个名为fix20的分支,并将file.txt的文本修改为这是fix20分支。然后我就承诺了 我切换到主分支,然后创建分支hotfix并切换到它 我修改了file.txt以获得文本这是修补程序。之后,我提交更改 现在我切换回主分支,并将其与修补程序合并。该文件(没有问题)将其文本更改为,这是修补程序(它们基本上是合并的)) 现在我与fix20分支合并,得到一个合并冲突。fil

例如:

  • 我有一个总支
  • 我创建一个文件
    file.txt
    ,然后在其中写入
    Master branch
    ,然后提交它
  • 我创建了另一个名为
    fix20
    的分支,并将
    file.txt
    的文本修改为
    这是fix20分支
    。然后我就承诺了
  • 我切换到主分支,然后创建分支
    hotfix
    并切换到它
  • 我修改了
    file.txt
    以获得文本
    这是修补程序
    。之后,我提交更改
  • 现在我切换回主分支,并将其与修补程序合并。该文件(没有问题)将其文本更改为
    ,这是修补程序
    (它们基本上是合并的))
现在我与fix20分支合并,得到一个合并冲突。
file.txt
既有来自fix20分支的文本,也有我与HotFix合并后的文本。在这一点上,我应该打开一个编辑器,决定应该留下什么,应该删除什么

问题是:为什么合并冲突会再次发生?为什么在我将主控程序与修补程序合并时,我没有决定保留哪个文本?当我与fix20分支合并时,为什么文件没有被合并(为什么文本没有像热修复程序那样被替换)?为什么这种冲突基本上是第二次而不是第一次发生的呢?

阅读全文。这与您遇到的问题相同,但情况略有不同


简言之: 答案是存在冲突,因为这两个分支没有任何提交


以下是您描述的步骤


Im使用3-diff-ads和diff算法

以下是该文件的内容:

<<<<<<< HEAD
This is hotfix branch
||||||| merged common ancestors
Master branch
=======
This is fix20 branch
>>>>>>> fix20

在您的案例中,您将看到它试图合并一个更新了同一文件的提交(两个分支都是从同一个提交创建的[merge base commit]),并导致冲突。

这里的问题是您知道自己的意图。。。但Git没有

Git是这样看待您所做的:您对同一行进行了两个独立的更改。当您合并第一个时,您的意图是明确的:您希望更改成为master的一部分。由于自您分支以来,master本身没有任何更改,所以这没有问题:只要合并的一侧更改了代码,Git就可以直接合并代码

当您尝试合并第二个更改时,情况就不再是这样了:通过合并第一个分支,您向主控引入了与第二个分支中的更改不直接“兼容”的更改。Git称之为:“分支已经分化”。Git不知道您是希望保留从第一个分支合并的内容,还是保留从第二个分支合并的内容

在您的情况下,这对您来说是显而易见的,因为第二个分支是同一事物的更新修复。。。但是许多合并涉及到对代码的更复杂的更改,合并第二个分支的正确方法可能是合并来自两个合并的更改:通常,如果两个合并的更改接触到同一行代码,那么它们都必须在代码上留下标记

原始代码示例:

send_request("bake cookies")
分支机构1:

send_request("bake cookies", additions: ["chocolate"])
分支机构2:

send_request("bake cookies", flour: "wheat")
合并这两行的正确方法可能不是逐字逐句地使用这两行中的一行,它可能更像这样:

send_request("bake cookies", flour: "wheat", additions: ["chocolate"])

由于您比Git更了解代码的意图,Git在这种情况下永远不会自动做出决定。

branch fix20与master分支有不同的提交历史,master分支没有提交历史,Git(或任何其他版本工具)无法知道您是想保留两个文本还是其中一个them@NikosM. 那么,为什么当我将它与热修复程序合并时,我想保留什么的问题没有出现?因为master更改了某个提交,但fix20也有另一个提交,所以工具无法保存know@NikosM. 这是否像需要重定基址的情况一样?不一定,除非您想重定分支的基址,例如您可能只需要添加到分支,但不需要重定基址。您所说的“合并基址”是什么意思?另外,我明白了,这篇文章和我的一样,但我仍然不明白,为什么会发生这种情况。写下为什么,需要花我几个月的时间。请你,至少解释一下你所说的合并基数是什么意思?问题基本上是:“为什么会发生这种情况”,而你只是写下了它的发生。等等,还在为你写完整的答案。使用合并基的通用定义,这里肯定有一个,即提交
c4d6cfb
(根提交)。我要补充的是,git与任何版本工具一样,使用(序列)差异,差异描述什么更改为什么。在master的情况下,diff是清晰的,一行变为另一行,但在branch的情况下,diff不能按原样应用(注意,所有版本工具都会发生这种情况,因为它们使用diff模式,而不仅仅是git)。一个工具中的每个版本历史记录只是一系列差异(按顺序应用),git在其他方面与其他工具不同,但这一点不一样
send_request("bake cookies", flour: "wheat", additions: ["chocolate"])