2014-03-31 113 views
1

我已經對代碼文件做了一堆更改,並在執行它之前檢查diff。從git編輯gunk時修復「修補程序不適用」-p

總結我的更改:我已將常規類聲明轉換爲模板類定義。在這樣做的時候,我從文件底部取出了一大塊代碼,並將它移動到頂部(現在需要在類之前定義的異常類),然後我將一堆代碼(方法聲明),每行代碼有幾行代碼(方法實現)。

Git無法正確地檢測到我的更改的上下文,並且基本上已刪除並添加了一行大混雜,這兩行之間並不一定有任何連接。差異。爲了稍後更容易檢查這些變化,我轉移了一系列更改以使其處於上下文環境中,但要小心保持所有添加和刪除的行按照相同的順序排列,保持添加和刪除的行數不變,等等。 。

當我做,我得到了錯誤消息

error: patch failed: include/aof/physics/magnetic-field.hpp:143 
error: include/aof/physics/magnetic-field.hpp: patch does not apply 
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]? 

好了,我什麼地方搞錯了。好的,我會再試一次。同樣的消息。

如果我回答上面的y,我可以回到我編輯的補丁,但是因爲我不知道它有什麼問題,所以對我無能爲力。在嘗試幾次不成功地編輯補丁後,我不禁想知道:有沒有辦法在這裏獲得更好的錯誤信息?我怎麼弄出爲什麼這個補丁不適用,所以我可以修復它?爲了澄清什麼,我試圖完成

原始補丁

簡單的例子。不太容易看到這裏發生了什麼...

-  ClassConstructor(const OtherClass& other, double d); 
+  ClassConstructor(const TOtherClass& other, double d) : _other(other), _d(d) { 

-  void method1() const; 
-  double calculation() const; 
-  double otherCalculation() const; 
+   _a = 1/d; 
+  } 

-  ~ClassDestructor() { }; // Yes, of course it's more sensibly named 
-  }; 
+  void method1() const { 
+    // this method does nifty stuff. 

- struct my_exception_type : public std::runtime_error { 
-  my_execption_type() : runtime_error("oops!") { 
     } 

-  virtual const char* what() const throw() { 
-   std::ostringstream cnvt; 
-   cnvt << runtime_error::what() ": Sorry, I shouldn't have done this..."; 
+  double calculation() const { 
+   return _a + _d; 
+  } 

-   return cnvt.str().c_str(); 
+  double otherCalculation() const { 
+   return 0.; // I'm lazy 
     } 

+  ~ClassDestructor() { }; // Yes, of course it's more sensibly named 
    }; 

我試圖編輯它。 (這個編輯是在SO完成的,所以不確定這個特定的編輯是否存在問題,但是你知道我正在對這個編輯進行什麼樣的編輯)。更容易理解這些變化,你不覺得嗎?

-  ClassConstructor(const OtherClass& other, double d); 
+  ClassConstructor(const TOtherClass& other, double d) : _other(other), _d(d) { 
+   _a = 1/d; 
+  } 

-  void method1() const; 
+  void method1() const { 
+    // this method does nifty stuff. 
+  } 

-  double calculation() const; 
+  double calculation() const { 
+   return _a + _d; 
+  } 

-  double otherCalculation() const; 
+  double otherCalculation() const { 
+   return 0.; // I'm lazy 
+  } 
    }; 
- struct my_exception_type : public std::runtime_error { 
-  my_execption_type() : runtime_error("oops!") { 
-  } 
-  virtual const char* what() const throw() { 
-   std::ostringstream cnvt; 
-   cnvt << runtime_error::what() ": Sorry, I shouldn't have done this..."; 
-   return cnvt.str().c_str(); 
- }; 

顯然,有一個與具有空行正確等數決策失誤的風險,但我的問題是,不僅在於它很難確保它是正確的 - 這也很難弄清楚我犯了什麼錯誤。

+0

請問這個問題有幫助:http://stackoverflow.com/questions/3268596/git-add-interactive-your-edited-hunk-does-not-apply? – LeGEC

+0

@LeGEC:這個問題在故障排除中給出了有用的指導,但它並沒有給我更多的東西,比我目前所做的還要多。沒有任何信息對我來說是全新的,並且它們都不是我目前的補丁(無論當前的補丁是什麼)。這個問題是,如果有一種方法可以從'git'本身中擠出更多的信息錯誤信息。 –

+0

我不確定我完全理解你想要達到的目標。你是否試圖編輯補丁,以便git記得「第1行」實際上是「第13行」的替代品,「第2行」實際上是「第26行」的替代品,等等......? – LeGEC

回答

2

不能使用git add -p告訴混帳「保持這個補丁對於兩個版本的文件之間的差異的痕跡」:混帳不商店不同之處或補丁,它存儲實際內容

在git中添加文件(git add myfile)時,該文件的該特定版本將根據其唯一的內容接收散列。 Git將保持沒有跟蹤它是如何從版本n-1變爲版本n的。

當你運行git diff時,git會實際檢索兩個版本的文件的內容,並再次運行diff算法。您嘗試編輯的補丁不會保存在內存中。


我能想到的,以實現你在找什麼最接近的方法是添加「同步點」爲DIFF算法本身:

1 - 從你的文件的第一個版本開始,提交第一中間版本,在每個「移民塊」的評論:

// migrating method1 : 
void medthod1() const; 

//migrating calculation : 
void calculation() const; 

//etc ... 

2 - 此之後第一次提交,寫你的實際遷移,保持評論:

// migrating method1 : 
void method1() const { 
    //this method does nifty stuff 
} 

// migrating calculation : 
void calculation() const { 
    return _a + _d; 
} 

//etc ... 

並提交此版本。

3-最後,刪除不需要的,嘈雜的評論,並提交這最後的版本。

當探索git歷史記錄時,遷移將顯示爲3次提交,您應該清楚地瞭解在通過提交2-檢查差異輸入時重寫的內容。

+1

好的。所以我試圖完成的東西基本上毫無意義。那麼,謝謝你爲什麼好的解釋! –

+0

你也可以用例如git來改變git的diff算法。 ' - 耐心「,在這種情況下往往會產生更好的結果。 – cincodenada

相關問題