2010-10-20 23 views
10

Các thay đổi được thực hiện đối với .vcproj của chúng tôi để khắc phục sự cố trên máy xây dựng (changeset 1700). Sau đó, một nhà phát triển đã sáp nhập các thay đổi của anh ấy (thay đổi 1710 đến 1715) vào trong thân cây, nhưng việc hợp nhất tự động đã ghi đè các thay đổi từ năm 1700. Tôi cho rằng điều này xảy ra vì anh ta đã chọn sai nhánh làm "cha mẹ" của hợp nhất. 2 câu hỏi).Một hợp nhất thủy ngân đã chọn những thay đổi sai, cách chính xác để sửa lỗi này là gì?

1) "đúng" cách lanh lợi để khắc phục vấn đề này, xem xét trong số tất cả các tập tin sáp nhập, chỉ có một tập tin đã được sáp nhập không đúng cách là gì, và

2) những gì nên các nhà phát triển đã thực hiện khác nhau theo thứ tự để đảm bảo điều này không xảy ra? Có cách nào chúng ta có thể thực thi cách "đúng" không?

Chỉnh sửa: Tôi có thể không rõ ràng về những gì đã xảy ra. Nhà phát triển A đã sửa đổi một dòng trong tệp .vcproj của chúng tôi đã xóa một tùy chọn cho trình biên dịch. Nhà phát triển B, làm việc từ một phụ huynh trước đó (giả sử changeset 1690), đã thực hiện một số thay đổi đối với các phần hoàn toàn khác nhau của dự án, nhưng ông đã làm chạm vào tệp .vcproj (chỉ cần không ở bất kỳ đâu gần các thay đổi được thực hiện bởi Nhà phát triển A). Khi Nhà phát triển B sáp nhập các thay đổi của anh ấy (trở thành thay đổi 1710 đến 1715), quá trình hợp nhất sẽ ghi đè các thay đổi từ 1700.

Để sửa lỗi này, tôi vừa sửa đổi tệp .vcproj để bao gồm thay đổi một lần nữa và kiểm tra Tôi chỉ muốn biết lý do tại sao Mercurial nghĩ rằng nó không nên giữ những thay đổi trong năm 1700, và có hay không có một cách "chính thức" để sửa lỗi này.

Chỉnh sửa thứ hai: Nhà phát triển B thề lên và xuống rằng Mercurial đã hợp nhất tệp .vcproj mà không nhắc anh giải quyết xung đột, nhưng dĩ nhiên có thể anh ta chỉ là sai, trong trường hợp này toàn bộ bài tập là học thuật.

+2

Cho ý kiến ​​của bạn tôi đặt cược những gì đã xảy ra là Visual Studio quá viết ' .vcproj' tệp sau khi nhà phát triển hợp nhất tệp. Nó nên đã sáp nhập sạch sẽ và không ném lên bất kỳ loại xung đột trong Mercurial, giống như các nhà phát triển cho biết. – Omnifarious

+0

Đó là hoàn toàn có thể, là tốt. – moswald

Trả lời

10

tôi sẽ đề cập đến phần thứ 2 của bạn câu hỏi đầu tiên ...

Nếu có sự mâu thuẫn, các công cụ hợp nhất tự động nên buộc các lập trình viên để quyết định cách hợp nhất sẽ xảy ra. Nhưng giả định chung là xung đột sẽ liên quan đến hai chỉnh sửa cho cùng một tập hợp các dòng. Nếu bằng cách nào đó một xung đột phát sinh do chỉnh sửa các dòng không gần nhau, việc hợp nhất tự động sẽ vô tình chọn cả hai chỉnh sửa và một lỗi sẽ xuất hiện.

Trường hợp chung của công cụ hợp nhất luôn hợp nhất đúng cách là rất khó giải quyết và thực sự không thể với công nghệ hiện tại. Dưới đây là ví dụ về ý nghĩa của tôi từ C:

int i; // Someone replaces this with 'short i' in one changeset stating 
     // that a short is more efficient. 

// ... lots of code; 

// Someone else replaces all the 65000s with 100000s in another changeset, 
// saying that more precision is needed. 
for (i = 0; i < 65000; ++i) { 
    integral_approximation_piece(start + i/65000.0, end + (i + 1)/65000.0); 
} 

Không có công cụ hợp nhất nào bắt được loại xung đột này. Công cụ sẽ phải thực sự biên dịch mã để thấy rằng hai phần của mã này có liên quan gì đến nhau, và trong khi đó có thể là đủ trong trường hợp này, tôi có thể xây dựng một ví dụ yêu cầu mã phải chạy và kết quả được kiểm tra để nắm bắt xung đột.

Điều này có nghĩa rằng những gì bạn thực sự phải làm là kiểm tra chặt chẽ mã của bạn sau khi hợp nhất, giống như bạn nên sau bất kỳ thay đổi nào khác. Phần lớn các hợp nhất sẽ dẫn đến các xung đột rõ ràng mà nhà phát triển sẽ phải giải quyết (mặc dù độ phân giải đó thường khá rõ ràng), hoặc sẽ hợp nhất một cách rõ ràng. Nhưng rất ít hợp nhất không phù hợp với một trong hai loại không thể dễ dàng được xử lý theo cách tự động.

Điều này cũng có thể được khắc phục bằng các phương pháp phát triển khuyến khích địa phương. Ví dụ một tiêu chuẩn mã hóa nói rằng "Các biến nên được khai báo gần nơi chúng được sử dụng."

Tôi đoán rằng .vcproj tệp đặc biệt dễ bị vấn đề này vì chúng không được nhà phát triển hiểu rõ và vì vậy nếu xung đột xuất hiện, họ sẽ không chắc chắn phải làm gì với chúng. Tôi đoán là điều này đã xảy ra và phát triển của bạn chỉ đơn giản là đã làm một phục hồi trở lại với phiên bản (s) ông đã kiểm tra tại.

Đối với phần 1 ...

Phải làm gì trong trường hợp này phụ thuộc rất nhiều vào bạn quá trình phát triển. Bạn có thể tách các thay đổi hợp nhất ra và làm lại nó, mặc dù điều đó sẽ không hoạt động tốt nếu nhiều người đã kéo nó, và nó sẽ làm việc đặc biệt kém nếu có rất nhiều changesets đã được kiểm tra trong đó dựa trên changeset hợp nhất.

Bạn cũng có thể kiểm tra một thay đổi mới khắc phục sự cố với quá trình hợp nhất.

Về cơ bản, bạn có hai tùy chọn.

Giai điệu bài đăng của bạn dường như cho tôi biết rằng bạn có thể có một số chính trị xung quanh vấn đề này trong tổ chức của bạn và mọi người đổ lỗi cho sự hợp nhất thường xuyên của Mercurial. Vì vậy, tôi sẽ chỉ ra rằng bất kỳ hệ thống kiểm soát thay đổi có thể có vấn đề này. Trong trường hợp của Subversion, ví dụ, mỗi khi một nhà phát triển thực hiện một bản cập nhật trong khi họ có những thay đổi xuất sắc trong thư mục làm việc của họ, họ đang làm một hợp nhất, và loại vấn đề này có thể phát sinh với bất kỳ hợp nhất nào.

+5

+1 Vì một trong những điều quan trọng nhất cần biết về việc hợp nhất là chúng là những cam kết nghiêm trọng như bất kỳ sự thay đổi mã nào. Chỉ có thực tế là có những công cụ làm cho chúng dễ dàng hơn không có nghĩa là nhà phát triển không cần quan tâm đến chúng. – Rudi

+3

Hm. Tôi không nghĩ tôi có bất kỳ "giai điệu" nào. Tôi tình cờ yêu Mercurial (như đội của tôi), và tôi muốn biết nếu có một "cách siêu sao" để sửa lỗi. – moswald

7

Trong tính năng hợp nhất không có cha mẹ, theo định nghĩa có hai và chỉ có hai cha mẹ. Khi ai đó được sáp nhập họ đang làm hai lựa chọn:

  1. gì hai changesets sẽ được coi là hai thay đổi
  2. nào trong những changesets sẽ là trái phụ huynh và đó sẽ là phải mẹ

Trong hai câu hỏi đó, câu hỏi đầu tiên là rất quan trọng, và điều thứ hai hầu như không quan trọng chút nào, mặc dù tôi mất một lúc để hiểu điều đó.

Bạn chọn cha mẹ bên trái bằng cách sử dụng hg update X. Điều đó thay đổi đầu ra của hg parents (hoặc trong các phiên bản mới hơn hg summary) và về cơ bản xác định những gì trong thư mục làm việc của bạn trước khi hợp nhất.

Bạn chọn cha mẹ phải bằng cách sử dụng hg merge Y. Điều đó nói rằng hợp nhất X (cha mẹ của thư mục làm việc) với changeset Y. Là một trường hợp đặc biệt, nếu chỉ có hai người đứng đầu trong kho của bạn và cha mẹ của bạn đã là một trong số họ thì Y sẽ mặc định cho người kia.

Tôi phải xem biểu đồ kết quả của bạn để biết chính xác những gì nhà phát triển đã làm, nhưng có thể anh ấy đã không cập nhật cái này hay cái khác trước khi gọi hợp nhất, điều này sẽ khiến anh ấy hợp nhất một đầu với một số điểm trở lại lịch sử.

Nếu nhà phát triển của bạn chọn đúng cha mẹ để hợp nhất thì trái và phải không quan trọng lắm - khác biệt thực sự duy nhất là khi người dùng sử dụng hg diff hoặc hg log -p hoặc một số lệnh khác hiển thị bản vá cho hợp nhất changeset, nó được hiển thị tương đối với cha mẹ bên trái. Đó là, tuy nhiên, chủ yếu là một yếu tố chỉ hiển thị. Chức năng chúng khá giống nhau.

Giả sử nhà phát triển của bạn đã chọn đúng các thay đổi thì những gì anh ta nên làm là kiểm tra kết quả hợp nhất trước khi cam kết.Hợp nhất phát triển phần mềm, không phải là một tác dụng phụ VCS gây phiền nhiễu và không kiểm tra trước khi cam kết là lỗi.

Sửa

Để sửa lỗi này, chỉ cần làm lại việc sáp nhập một cách chính xác. Sử dụng hg update để đặt một phụ huynh, sử dụng hg merge để chọn người kia. Đảm bảo rằng thư mục làm việc hiện tại của bạn là chính xác và sau đó cam kết. Bạn có thể loại bỏ hợp nhất xấu của mình bằng cách sử dụng một cái gì đó như hg strip hoặc tốt hơn, chỉ cần đóng nhánh của mình với hg commit --close-branch sau khi cập nhật lên nó.

Tránh

Bạn nói "đồng bóng tự động hợp nhất", nhưng lanh lợi không thực sự tự động hợp nhất. Nó thực hiện một số premerge là một sự kết hợp cực kỳ thận trọng của những thay đổi rõ ràng, nhưng nó rất cẩn thận, nó thậm chí sẽ không hợp nhất cho bạn nếu mỗi phụ huynh hợp nhất thêm mã trong cùng một vùng vì nó không thể biết khối mã bạn muốn đầu tiên.

Bạn có thể tắt premerge này hoàn toàn hoặc trên cơ sở file-by-file bằng cách sử dụng tùy chọn cấu hình công cụ hợp nhất:

https://www.mercurial-scm.org/wiki/MergeToolConfiguration?highlight=premerge

+0

Tôi nghĩ rằng những gì Mercurial lưu trữ như là cha mẹ trái và phải đã làm với hash có giá trị cao hơn khi được biểu diễn như một số nguyên. – Omnifarious

Các vấn đề liên quan