2015-06-14 69 views
1

我有一個奇怪的問題,我從來沒有見過git的合併功能。我正在將一個分支的一些更改合併到master,並且git似乎一直在遇到一個特定文件的問題。Git不斷地合併一個文件不正確

它基本上將內容合併到看似隨機的地方。這是最近幾次這個文件被合併的情況。

下面是我對MyFile.cs製成另一分支(稱爲somebranch)的變化:

-    service.UpdateUser(user); 
+    service.UpdateUser(user, false); 
... 
-    User[] users = client.ImportPersonnel(a, b, c); 
+    UserImportResults results = client.ImportPersonnel(a, b, c); 
... 
-    Response.Write(JsonConvert.SerializeObject(new { UserCount = users.Length })); 
+    Response.Write(JsonConvert.SerializeObject(new { Added = results.NumAdded, Updated = results.NumUpdated })); 

只是幾行代碼。

於是我就這樣做:

git merge somebranch master 

大部分是沒有衝突合併。一些文件確實有衝突,但它們是有道理的。但automerge將其更改爲MyFile.cs很奇怪。例如,行

service.UpdateUser(user, false); 

被卡在一些隨機發生的master版本的MyFile.cs中間:

   if (Request["X"] != null) 
       { 
        CalculateSomething(Request["X"]); 
       } 

<<<<<<< HEAD 
       if (Request["Y"] != null) 
       { 
        CalculateSomething(Request["Y"]); 
       } 
======= 
      try 
      { 
       client.UpdateUser(user, false); 
>>>>>>> qaqc-release 

       if (Request["Z"] != null) 
       { 
        CalculateSomething(Request["Z"]); 
       } 

我不知道Git是如何確定如何將兩個文件合併在一起,但我從來沒有見過它這樣做過。它只發生在這個文件中。

它應該合併變化的地方和它實際上正在做它的地方相距超過100線。然而,這個文件長度差不多有5000行,所以相對來說它並不是太遙遠,但仍然很奇怪。

任何想法,爲什麼發生這種情況或我能做些什麼?這是一個經常被觸及的文件,因此它會不斷合併。在去年左右的發展中,這不是一個問題,所以我不確定發生了什麼變化,但解決這個問題會很好。

+0

您可以考慮'git'的行爲提示5000行源文件不可維護。 –

回答

1

兩件事情來檢查:

  • 由於這是一個經常被合併的文件,或許有進行一些不正確的合併,然後在過去的退了出去,這就是被記錄的git rerere。如果你已經啓用了元數據,那麼也許可以查看元數據?
  • 您的代碼格式化可能實際上正在拋出一些東西。如果文件有很多可以匹配補丁開頭的位置,特別是只添加新行的補丁,那麼如果它沒有考慮足夠的上下文,我可以很容易地看到它變得混亂。也許有一個標誌git merge,它會告訴它看起來更廣泛的上下文比默認情況下,以防止錯誤的匹配?
+0

有趣的是,你在行尾字符(Windows \ r \ n與Unix \ n)的差異可能是責任?我們只是使用Atlassian SourceTree建立了一個新的開發者,並且有一些關於使用哪一行結束風格的問題。 – d512

+0

這肯定會導致有趣的問題。這當然值得調查。 – Novelocrat