2012-04-18 10 views
5

Ok, ở đây đi Q. của tôi Không "git rerere" so sánh băm của hai tập tin để tìm ra độ phân giải? Nghĩa là, nói rằng tôi có một tập tin XML chứa thẻ này:Làm thế nào để git rerere tìm ra điểm tương đồng giữa hai xung đột?

<number>12</number> 

Khi tôi có một cuộc xung đột, con số đó thường bị thay đổi một cái gì đó giống như 13, 14, vv, vì vậy tôi đang mắc kẹt với:

<<<<<<< 
<number>12</number> 
======= 
<number>13</number> 
>>>>>>> 

Có thể định tuyến lại tự động giải quyết xung đột này ngay cả khi các con số không giống như lần trước? Tôi luôn luôn muốn nó để giải quyết nó theo cách mà nó có số cao hơn (ví dụ trên, 13). Vì vậy, nếu nó ghi lại độ phân giải cho các số 12 và 13, nó sẽ giải quyết xung đột với các số khác nhau? Tôi có một sự nghi ngờ nó sẽ không, nhưng cũng có thể yêu cầu.

Trả lời

7

Có thể định tuyến lại tự động giải quyết xung đột này ngay cả khi các con số không giống như lần trước? Tôi luôn luôn muốn nó để giải quyết nó theo cách mà nó có số cao hơn (ví dụ trên, 13).

Không, git rerere không thể thực hiện điều đó.

Khi bạn sử dụng git rerere, bạn đang yêu cầu nó phải nhớ hai điều:

  • một cuộc xung đột cụ thể (có nghĩa là, các văn bản đen của hunks đó là mâu thuẫn và các tập tin mà họ đang ở trong); và
  • độ phân giải mà nên được áp dụng cho cuộc xung đột

Bởi vì đây là những hunk literals (ví dụ: "thay thế 12 với 13") chứ không phải là một số loại chức năng chuyển đổi (ví dụ: "thay thế N với N + 1 "), git không thể suy ra rằng bạn muốn thay thế từng số bằng số cao hơn. Nếu sau này git gặp xung đột không phù hợp với bất kỳ xung đột nào được nhớ trước đó của nó, nó giống như là nó không bao giờ gặp phải xung đột đó, ngay cả khi nó có thể giống nhau (như trong ví dụ của bạn nơi các con số luôn luôn là một tắt).

Có thể thoát ra một cách nếu tệp XML này được tạo tự động. Trong trường hợp đó, bạn có thể muốn xem xét không giữ nó trong kiểm soát nguồn ở tất cả, và thay vào đó, tạo ra nó trong thời gian chạy. Sau đó, bạn sẽ không bao giờ có xung đột tương ứng để dọn dẹp.

Cách tiếp cận khác là tránh git rerere hoàn toàn và thay vào đó viết trình điều khiển hợp nhất tùy chỉnh sẽ giải quyết mọi thứ cho bạn. Tôi đã làm điều này trước đây, nhưng đó là một số lượng không nhỏ của công việc, và nó đòi hỏi bạn phải viết và kiểm tra một số mã. Nếu bạn quan tâm đến chiến lược này, hãy xem the link trong Karl's answer.

+0

Ah, nghĩ vậy. Cảm ơn bạn đã có câu trả lời chuyên sâu.Thật không may, những con số này luôn được nhập bởi con người vì vậy có vẻ như tôi sẽ xem xét trình điều khiển hợp nhất tùy chỉnh đó. Cảm ơn lời khuyên, bạn và Karl. – mart1n

2

Vanilla git không so sánh các tệp theo cách đó. Nó thực hiện một so sánh chuỗi nghiêm ngặt và không biết gì về ngữ nghĩa của nó.

Tuy nhiên, hãy xem "Xác định trình điều khiển hợp nhất tùy chỉnh" trong gitattributes man page. Nó cho phép bạn viết chương trình của riêng bạn để giải quyết sự hợp nhất nào đó theo bất kỳ cách nào bạn muốn, bao gồm cả việc chọn số cao hơn.