2009-11-18 73 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