2009-11-18 63 views
3

我只是测试混帐,看看我是否可以用它来做我的工作。我遇到了一个似乎很小的问题,但可能会成为真正的代码。 我的文件看起来像: 的text.txt 我有个地方分支“BRANCH1”,并在这两个分支和主COMMITED变化。 在主人,我改变了第二个分支的第一行。 所以对于主的差异看起来是这样的:这是怎么冲突

+1 master 
2 
3 
4 

对于分支,它是:

<<<<<<< HEAD 
1 master 
2 
======= 
1 
2b1 
>>>>>>> branch1 
3 
4 

我知道这一个:

1 
-2 
+2b1 
3 
4 

运行git合并BRANCH1在冲突解决可以轻松解决。但无论如何,这是一场冲突。不应该git能够合并这个?

+0

>你是否建议,它可以正常工作更多的线?是的,如果我们正在谈论*修改过的行,而不是关于新行或删除行(这会改变行数,并且没有上下文肯定会每次发生冲突)。 – VonC 2009-11-18 16:29:56

+0

>顺便说一句,我尝试了rebase - >同样的冲突。如果你添加了'-C0'参数并且仍然存在冲突,这意味着一些行重叠,新行或删除的行存在差异。 '-C0'只在有相同的行的情况下才有效,除了一对(每个版本中不同)被修改。 – VonC 2009-11-18 16:31:38

回答

4

有没有上下文隔离这两个变化,所以不清楚正确的分辨率应该是什么。用一行上下文进行更改:将块“1/2”更改为“1主/ 2”,并将块“1/2/3”更改为“1/2b1/3”。

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

在更复杂的情况下,足够的上下文是非常重要的,因为没有它,合并将补丁应用到错误的位置很容易,而不会警告本地分支是否移动了足够的线条,原始位置足够不具体,以至于补丁在不应该时仍然应用。

5

夫妇的评论:

  • 第一,这样一个小例子将永远不会无论如何合并:

    warning: Cannot merge binary files: afile.txt (HEAD vs. abranch)
  • 那么,如果你有很多,你知道应该“小”合并冲突独立于上下文解决,您可以尝试重新初始化您的分支在master之上,忽略上下文:

    git rebase -C0 master

然后将您的分支合并到master

这通常是不是一个好主意,忽略一个重订所有方面,但如果你是一定关于您的修改(如“需要修改,没有上下文的所有”),它会工作。

git rebase man page

-C<n> 

确保至少<n>行之前和每次更改后周围的上下文匹配的。
当存在较少的周围环境线时,它们都必须匹配。
默认情况下,不会忽略上下文。


你可以(在PowerShell会话这里,与Git1.6.5.1,XP系统)测试它很轻松地

首先创建一个小蝙蝠实用genfile.bat

echo hello, World %1 > afile.txt 
echo hello, World %2 >> afile.txt 
echo hello, World 3 >> afile.txt 
echo hello, World 4 >> afile.txt 
echo hello, World 5 >> afile.txt 

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

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" 

您的文件看起来是这样的:

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 

然后修改它的主人

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 

克隆了一个回购的第一个实验(即:中abranch合并为master

PS D:\[...]\m0> cd .. 
PS D:\git\tests\mergeLines> git clone m0 m1 
PS D:\git\tests\mergeLines> cd m1 
PS D:\[...]\m1> git co -b abranch origin/abranch 
PS D:\[...]\m1> git co master 
PS D:\[...]\m1> git merge abranch 

这就给了你一个矛盾:再度

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 

克隆了第一个回购协议,这次在master之上第一个abranch,没有上下文:

PS D:\[...]\m1> cd .. 
PS D:\git\tests\mergeLines> git clone m0 m2 
PS D:\git\tests\mergeLines> cd m2 
PS D:\[...]\m2> git co -b abranch origin/abranch 
PS D:\[...]\m2> git rebase -C0 master 

你的文件被悄悄合并:

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(-) 
+0

到目前为止,感谢您的帮助。 我刚开始使用git,至今没有听到任何关于上下文的信息。 (快速搜索没有使它更清晰) 无论如何,这是一个我经常处理的情况,除了更多的代码行。你是否建议,它可以正常工作更多的线?我已经考虑过一段时间了。我认为,如果Git如此出众,这应该起作用。 顺便说一句,我尝试rebase - >相同的冲突。 – Benjamin 2009-11-18 16:03:00