2016-12-20 68 views
3

合併分支時,通常會收到命令提示符中列出的合併衝突。我知道如何通過查看有衝突的文件並進行適當的更改來解決問題。我們也有「mergetool」,它可以是非常有用的(雖然不是很好使用它)。從我從不同的來源讀取您解決這項問題的步驟是:如何檢查git merge問題是否已修復?

  • 修復衝突
  • 添加

這看起來很簡單。但是如果我錯過了一些東西而不去修復它呢?除了使用mergetool之外,Git是否提供了一種檢查是否還有其他要修復的方法?

+1

你的意思是不是固定的?如果仍然存在衝突,你的意思是?如果您能夠完成合並,衝突必須已解決。 – dave

+0

一旦你添加並提交一個合併,你告訴Git你沒有更多的改變。如果你錯過了什麼,那就是你的問題。修復它並重新提交或'--amend'您的合併提交。 –

+1

可能重複的[如何解決合併衝突在Git?](http://stackoverflow.com/questions/161813/how-to-resolve-merge-conflicts-in-git) –

回答

2

務必:

git diff -S "<<<<<<< HEAD" -S "=======" -S ">>>>>>> $(git name-rev --name-only MERGE_HEAD)" HEAD 

這個worktree的內容與HEAD比較,但只顯示,如果一個或一個以上三種類型合併商標的被包含在任何輸出更改。

例如,如果你從一個分支合併稱爲develop,一個未合併的文件可能是這樣的:

public void fooTheBar(Bar input) { 
<<<<<<< HEAD 
    if (input == null) { 
    throw new Exception("input cannot be null!"); 
    } 
======= 
    Console.WriteLine("preparing to foo the bar"); 
>>>>>>> develop 
    input.foo(); 
} 

因此,要確保所有文件已被合併,你需要尋找以下任何三行:

<<<<<<< HEAD 
======= 
>>>>>>> develop 

而這就是命令中-S參數的作用。因爲它不會永遠是develop,我們使用命令:

git name-rev --name-only MERGE_HEAD 

讓您合併到當前分支的分支的名稱。

(你也許可以搜索只是那些線之一,但搜索所有三是更加強勁,並會告訴你在哪裏,例如你忘了只是刪除線的一個案例。)

由於命令將工作樹與HEAD進行比較,而不僅僅是對分階段更改,即使您有git add ed仍包含衝突的文件,此工作也會起作用。

+0

這似乎更像我在嘗試在添加和提交之前檢查合併衝突時所指的內容。說實話,我真的不確定git有這種能力會有什麼期望,但這似乎是避免提交未解決合併的好方法。 – polaris

+1

'git name-rev'技巧非常聰明!但是一個小問題,如果你使用'git checkout -m'來重新創建合併衝突,它往往會失去原始的符號名稱,特別是在重新綁定的櫻桃挑選期間。查找標誌V形可能更安全(儘管這些都是可調的)。 – torek

0

我認爲這個問題暗指的是 - 開發人員如何知道所有手動合併都已完成?例如,你可能會遇到一個簡單的合併,像這樣:

git checkout master 
git merge dev 

,然後你會得到:

CONFLICT blah blah 
CONFLICT blah blah 
CONFLICT blah blah 

有時還會有更多的衝突比你可以指望,(當你是不負責任)。

我做的是解決所有手動合併,我可以找到,然後我做「< < < < <」和「>>>>>」字符代碼庫序列進行全局搜索。似乎在過去爲我工作得很好。如果您沒有任何這些字符串,那麼很可能您已經處理了需要照顧的所有手動合併。只要你不使用git merge-Xtheirs-Xours選項,那麼你可以相信你已經成功地合併了代碼,這是你自己的條件。

0

在添加文件之前,請確保在文件中找不到任何'===='。您可以輕鬆地在命令提示符下用vim實現這一目標:

vim yourFile 
/==== 
Enter 

如果你發現什麼都沒有,那麼你是好它添加!

希望它可以幫助