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
。之后,我提交更改这是修补程序
- 现在我切换回主分支,并将其与修补程序合并。该文件(没有问题)将其文本更改为
(它们基本上是合并的)),这是修补程序
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"])