Git 当我合并两个在同一行上有不同文件的分支时,冲突不会';怎么会发生?
假设有一个分支a。我从分支a创建了两个分支A1、A2。再次从分支A2创建了一个分支A21。。我更改了X文件中的第2行,并提交并推送到A21。现在我合并这些更改为A2。。现在我把收银台改成了A2。当我合并原点/A时,没有冲突。。怎么用?我了解到,在合并过程中,如果同一行中存在差异或文件被删除,就会发生冲突。但在上述场景中,A2中的更改在合并后保持不变,冲突也不会发生。。谁能解释一下原因。首先:不要看分支名称。查看提交和提交图。您将仅使用名称来查找提交本身,然后使用图形。使用图形查看器,或者运行git log--graph(也可以使用Git 当我合并两个在同一行上有不同文件的分支时,冲突不会';怎么会发生?,git,git-merge,git-merge-conflict,Git,Git Merge,Git Merge Conflict,假设有一个分支a。我从分支a创建了两个分支A1、A2。再次从分支A2创建了一个分支A21。。我更改了X文件中的第2行,并提交并推送到A21。现在我合并这些更改为A2。。现在我把收银台改成了A2。当我合并原点/A时,没有冲突。。怎么用?我了解到,在合并过程中,如果同一行中存在差异或文件被删除,就会发生冲突。但在上述场景中,A2中的更改在合并后保持不变,冲突也不会发生。。谁能解释一下原因。首先:不要看分支名称。查看提交和提交图。您将仅使用名称来查找提交本身,然后使用图形。使用图形查看器,或者运行gi
--all--decoration--oneline
)。您将看到带有线条的图像或文本将提交连接到其父提交,形成一个树或图形结构:
* a123456 last commit on A1
* a123457 another commit on A1
| * a2fedcb last commit on A2
|/
* a0dead0 latest shared commit reachable from both A1 and A2
.
.
.
例如,或从到查看下面的图像
一旦有了这个图表,就应该相对清楚地知道术语merge base是什么意思了。两个特定提交的合并基础是两个分支共享的提交。在上面的输出中,这将是commita0dead0
如果我们水平地重新绘制图形,可能会更清楚两个分支的分歧:
o--...--X <-- you-are-on-this-branch (HEAD)
/
...--o--*
\
o--...--Y <-- you-ask-to-merge-this
然后,Git将合并基与提交Y
进行比较,以查看它们做了什么:
git diff--查找重命名
Git现在只需将这两组更改组合在一起,将它们全部应用于合并基础中的任何内容,如果一切顺利,则执行新的合并提交,这也会移动当前分支:
o--...--X
/ \
...--o--* M <-- you-are-on-this-branch (HEAD)
\ /
o--...--Y <-- you-ask-to-merge-this
o--…--X
/ \
首先:不要看分支名称。查看提交和提交图。您将仅使用名称来查找提交本身,然后使用图形。使用图形查看器,或者运行git log--graph
(也可以使用--all--decoration--oneline
)。您将看到带有线条的图像或文本将提交连接到其父提交,形成一个树或图形结构:
* a123456 last commit on A1
* a123457 another commit on A1
| * a2fedcb last commit on A2
|/
* a0dead0 latest shared commit reachable from both A1 and A2
.
.
.
例如,或从到查看下面的图像
一旦有了这个图表,就应该相对清楚地知道术语merge base是什么意思了。两个特定提交的合并基础是两个分支共享的提交。在上面的输出中,这将是commita0dead0
如果我们水平地重新绘制图形,可能会更清楚两个分支的分歧:
o--...--X <-- you-are-on-this-branch (HEAD)
/
...--o--*
\
o--...--Y <-- you-ask-to-merge-this
然后,Git将合并基与提交Y
进行比较,以查看它们做了什么:
git diff--查找重命名
Git现在只需将这两组更改组合在一起,将它们全部应用于合并基础中的任何内容,如果一切顺利,则执行新的合并提交,这也会移动当前分支:
o--...--X
/ \
...--o--* M <-- you-are-on-this-branch (HEAD)
\ /
o--...--Y <-- you-ask-to-merge-this
o--…--X
/ \
…--o--*M除了@torek所说的之外,git
将在更改相同的情况下处理合并,即使更改是独立进行的
在这里,我分别在branch1
和branch2
的同一个文件中做了相同的更改,然后将branch2
合并到branch1
/mnt/c/git/ConsoleApp1 (branch1)>git commit -a -m "Adding Foo in branch1"
[branch1 c03dcc2] Adding Foo in branch1
1 file changed, 4 insertions(+)
/mnt/c/git/ConsoleApp1 (branch1)>git checkout develop
error: pathspec 'develop' did not match any file(s) known to git.
/mnt/c/git/ConsoleApp1 (branch1)>git checkout master
Switched to branch 'master'
/mnt/c/git/ConsoleApp1 (master)>git checkout -b branch2
Switched to a new branch 'branch2'
/mnt/c/git/ConsoleApp1 (branch2)>git commit -a -m "Adding Foo in branch2"
[branch2 d433128] Adding Foo in branch2
1 file changed, 4 insertions(+)
/mnt/c/git/ConsoleApp1 (branch2)>git merge branch1
Merge made by the 'recursive' strategy.
结果:没有冲突 除了@torek所说的之外,git
将在更改相同的情况下处理合并,即使更改是独立进行的
在这里,我分别在branch1
和branch2
的同一个文件中做了相同的更改,然后将branch2
合并到branch1
/mnt/c/git/ConsoleApp1 (branch1)>git commit -a -m "Adding Foo in branch1"
[branch1 c03dcc2] Adding Foo in branch1
1 file changed, 4 insertions(+)
/mnt/c/git/ConsoleApp1 (branch1)>git checkout develop
error: pathspec 'develop' did not match any file(s) known to git.
/mnt/c/git/ConsoleApp1 (branch1)>git checkout master
Switched to branch 'master'
/mnt/c/git/ConsoleApp1 (master)>git checkout -b branch2
Switched to a new branch 'branch2'
/mnt/c/git/ConsoleApp1 (branch2)>git commit -a -m "Adding Foo in branch2"
[branch2 d433128] Adding Foo in branch2
1 file changed, 4 insertions(+)
/mnt/c/git/ConsoleApp1 (branch2)>git merge branch1
Merge made by the 'recursive' strategy.
结果:没有冲突 在您的描述中,您只谈到一个变化:
我更改了X文件中的第2行,并提交并推送到A21
你从来不会说这样的话“…在分支A上,我把X文件中的第2行改成了其他行并提交了它。”
如果这是真实情况(即游戏中只有一个变化),则不可能发生冲突 在您的描述中,您只谈到一个变化:
我更改了X文件中的第2行,并提交并推送到A21
你从来不会说这样的话“…在分支A上,我把X文件中的第2行改成了其他行并提交了它。”
如果这是真实情况(即游戏中只有一个变化),则不可能发生冲突 我不是这方面的专家,但Git有一个合并算法,如果它决定知道该做什么,它可能能够自动解决问题。不能保证每次合并都会因冲突而暂停。@TimBiegeleisen超过183k rep和goldengit
tag,但没有专家,嗯?:'-)天哪,如果是这样,我是什么?哦。@Romanvaleri读了下面Torek的回答,你会发现我对自己的评价是这样的:-)@TimBiegeleisen我已经多次看到他的帖子了,很漂亮:“-)此外,我很抱歉在这里开始了这个话题之外的聊天,而我知道这里不是那个地方。今天晚些时候我会删除我的评论。。。天哪,我喜欢git。我不是这里的专家,但git有一个合并算法,如果它决定知道该怎么做,它可能能够自动解决问题。不能保证每次合并都会因冲突而暂停。@TimBiegeleisen超过183k rep和goldengit
tag,但没有专家,嗯?:'-)天哪,如果是这样,我是什么?哦。@Romanvaleri读了下面Torek的回答,你会发现我对自己的评价是这样的:-)@TimBiegeleisen我已经多次看到他的帖子了,很漂亮:“-)此外,我很抱歉在这里开始了这个话题之外的聊天,而我知道这里不是那个地方。今天晚些时候我会删除我的评论。。。天哪,我爱吉特。