Git 这怎么会是冲突

Git 这怎么会是冲突,git,merge,conflict,Git,Merge,Conflict,我只是在测试git,看看是否可以将它用于我的工作。我遇到了一个看起来很小的问题,但用真正的代码可能会变成一个真正的问题。 我的文件看起来像: text.txt 1. 2. 3. 4. 我有一个本地分支“branch1”,并承诺对分支和主分支进行更改。 在master中,我将分支中的第一行更改为第二行。 因此,master的差异如下所示: +1 master 2 3 4 hello, World 1 hello, World 2 hello, World 3 hello, World 4

我只是在测试git,看看是否可以将它用于我的工作。我遇到了一个看起来很小的问题,但用真正的代码可能会变成一个真正的问题。 我的文件看起来像: text.txt 1. 2. 3. 4. 我有一个本地分支“branch1”,并承诺对分支和主分支进行更改。 在master中,我将分支中的第一行更改为第二行。 因此,master的差异如下所示:

+1 master
 2
 3
 4
hello, World 1
hello, World 2
hello, World 3
hello, World 4
hello, World 5
对于分支机构,它是:

 1
-2
+2b1
 3
 4
运行git merge branch1可解决冲突:

<<<<<<< HEAD
1 master
2
=======
1
2b1
>>>>>>> branch1
3
4
Auto-merging afile.txt
CONFLICT (content): Merge conflict in afile.txt
Automatic merge failed; fix conflicts and then commit the result.

PS D:\[...]\m1> type afile.txt
<<<<<<< HEAD
hello, World 1_master 
hello, World 2 
=======
hello, World 1 
hello, World 2_modified 
>>>>>>> abranch
hello, World 3 
hello, World 4 
hello, World 5 
>branch1
3.
4.

我知道这个问题很容易解决。但这怎么会是一场冲突呢。git不应该合并这两个更改吗?

没有上下文将这两个更改隔离开来,因此不清楚正确的解决方案应该是什么。在一行上下文中,更改为:将块“1/2”更改为“1主/2”,并将块“1/2/3”更改为“1/2b1/3”

尝试将第二个“修补程序”应用于第一个修补程序的结果会导致错误,因为成功应用修补程序所需的上下文不匹配。补丁需要“1/2/3”,但有“1主/2/3”

在更复杂的场景中,充足的上下文非常重要,因为没有上下文,如果本地分支已经移动了足够多的行,并且在原始位置检查的最小上下文数量足够不特定,以至于补丁在不应该应用时仍然应用,则merge很容易在没有警告的情况下将补丁应用到错误的位置。

两条注释:

  • 首先,这样一个小例子无论如何也不会被合并:

    warning: Cannot merge binary files: afile.txt (HEAD vs. abranch)

然后将分支合并到
master

一般来说,忽略重基的所有上下文不是一个好主意,但如果您确定自己的修改(如“修改完全不需要上下文”),它将起作用

发件人:

然后创建回购协议并添加文件:

PS D:\git\tests\mergeLines> git init m0
PS D:\git\tests\mergeLines> cd m0
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1 2
PS D:\[...]\m0> git add -A
PS D:\[...]\m0> git ci -m "afile to be modified concurrently"
您的文件如下所示:

+1 master
 2
 3
 4
hello, World 1
hello, World 2
hello, World 3
hello, World 4
hello, World 5
在分支中修改它

PS D:\[...]\m0> git co -b abranch
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1 2_modified
PS D:\[...]\m0> git ci -a -m "afile modified in abranch"
你将有:

hello, World 1
hello, World 2_modified
hello, World 3
hello, World 4
hello, World 5
然后在master中修改它

PS D:\[...]\m0> git co master
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1_master 2
PS D:\[...]\m0> git ci -a -m "afile modified in master"
这给了你:

hello, World 1_master
hello, World 2
hello, World 3
hello, World 4
hello, World 5
克隆该repo进行第一次实验(即:将
abranch
合并到
master

这会给你带来冲突:

<<<<<<< HEAD
1 master
2
=======
1
2b1
>>>>>>> branch1
3
4
Auto-merging afile.txt
CONFLICT (content): Merge conflict in afile.txt
Automatic merge failed; fix conflicts and then commit the result.

PS D:\[...]\m1> type afile.txt
<<<<<<< HEAD
hello, World 1_master 
hello, World 2 
=======
hello, World 1 
hello, World 2_modified 
>>>>>>> abranch
hello, World 3 
hello, World 4 
hello, World 5 
您的文件以静默方式合并:

hello, World 1_master
hello, World 2_modified
hello, World 3
hello, World 4
hello, World 5
当然,如果您切换回
master
,现在合并
abranch
,结果将是一个快进合并

PS D:\git\tests\mergeLines\m2> git co master
Switched to branch 'master'
PS D:\git\tests\mergeLines\m2> git merge abranch
Updating c8f48b4..8bee1d2
Fast forward
 afile.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

到目前为止,谢谢你的帮助。我只是从git开始,到目前为止还没有听说过任何上下文。(快速搜索并没有让它变得更清晰)无论如何,这是我经常处理的一个场景,除了更多的代码行。你认为,它可以与更多的线路一起正常工作吗?我考虑这个问题已经有一段时间了。我认为,如果Git如此优秀,那么它应该可以工作。顺便说一句,我试过了rebase->相同的冲突。>你认为,它可以与更多的行一起正常工作吗?是的,如果我们谈论的是修改过的行,而不是新行或删除的行(这会改变行的数量,并使上下文的缺失成为每次都有冲突的可靠方式)。>顺便说一句,我尝试了重设基础->相同的冲突。如果确实添加了
-C0
参数,但仍然存在冲突,则表示某些行重叠,新行或删除的行作为差异存在
-C0
仅在存在相同行的情况下有效,但修改的两行(每个版本中不同)除外。
PS D:\git\tests\mergeLines\m2> git co master
Switched to branch 'master'
PS D:\git\tests\mergeLines\m2> git merge abranch
Updating c8f48b4..8bee1d2
Fast forward
 afile.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)