Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.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_Git Merge_Git Merge Conflict - Fatal编程技术网

Git 当我合并两个在同一行上有不同文件的分支时,冲突不会';怎么会发生?

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

假设有一个分支a。我从分支a创建了两个分支A1、A2。再次从分支A2创建了一个分支A21。。我更改了X文件中的第2行,并提交并推送到A21。现在我合并这些更改为A2。。现在我把收银台改成了A2。当我合并原点/A时,没有冲突。。怎么用?我了解到,在合并过程中,如果同一行中存在差异或文件被删除,就会发生冲突。但在上述场景中,A2中的更改在合并后保持不变,冲突也不会发生。。谁能解释一下原因。

首先:不要看分支名称。查看提交和提交图。您将仅使用名称来查找提交本身,然后使用图形。使用图形查看器,或者运行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是什么意思了。两个特定提交的合并基础是两个分支共享的提交。在上面的输出中,这将是commit
a0dead0

如果我们水平地重新绘制图形,可能会更清楚两个分支的分歧:

          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是什么意思了。两个特定提交的合并基础是两个分支共享的提交。在上面的输出中,这将是commit
a0dead0

如果我们水平地重新绘制图形,可能会更清楚两个分支的分歧:

          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和golden
git
tag,但没有专家,嗯?:'-)天哪,如果是这样,我是什么?哦。@Romanvaleri读了下面Torek的回答,你会发现我对自己的评价是这样的:-)@TimBiegeleisen我已经多次看到他的帖子了,很漂亮:“-)此外,我很抱歉在这里开始了这个话题之外的聊天,而我知道这里不是那个地方。今天晚些时候我会删除我的评论。。。天哪,我喜欢git。我不是这里的专家,但git有一个合并算法,如果它决定知道该怎么做,它可能能够自动解决问题。不能保证每次合并都会因冲突而暂停。@TimBiegeleisen超过183k rep和golden
git
tag,但没有专家,嗯?:'-)天哪,如果是这样,我是什么?哦。@Romanvaleri读了下面Torek的回答,你会发现我对自己的评价是这样的:-)@TimBiegeleisen我已经多次看到他的帖子了,很漂亮:“-)此外,我很抱歉在这里开始了这个话题之外的聊天,而我知道这里不是那个地方。今天晚些时候我会删除我的评论。。。天哪,我爱吉特。