Là xung đột phức tạp thường xuyên là một dấu hiệu của vấn đề?


35

Trong nhóm của chúng tôi, chúng tôi sử dụng Git làm kiểm soát nguồn của chúng tôi. Chúng tôi có một số lĩnh vực mã gần như độc lập nhưng có một số chồng chéo. Gần đây chúng tôi đã thảo luận về quy trình công việc và phương pháp tiếp cận để sử dụng kiểm soát nguồn. Một khiếu nại xuất hiện khi tôi quảng cáo bằng cách sử dụng quy trình chi nhánh tính năng là mọi người thường gặp phải các xung đột hợp nhất phức tạp mà họ giải quyết không chính xác. Bởi phức tạp, tôi có nghĩa là "không rõ ràng như làm thế nào để giải quyết". Trong bối cảnh này, các quy trình công việc khác đang được sử dụng tích cực hơn, chẳng hạn như quy trình làm việc dựa trên cơ sở "pull rebase".

Là người ủng hộ cách tiếp cận nhánh tính năng, tôi không thực sự nhận được khiếu nại. Có, bạn phải cập nhật các nhánh tính năng cục bộ của mình từ chủ hoặc bất cứ nơi nào, nhưng đó là vấn đề thực sự duy nhất tôi thấy. Tôi nghĩ rằng nếu sự hợp nhất của bạn luôn phức tạp và có thể có tác động thứ yếu, thì đó là vấn đề làm việc nhóm nhiều hơn là vấn đề Git.

Tôi có đúng trong suy nghĩ này không? Là xung đột phức tạp là một dấu hiệu của bất cứ điều gì tốt hay xấu?


1
Các tính năng kéo dài bao lâu? Làm thế nào tốt mô-đun là mã? Bạn có thể (ví dụ), chọn cherry trong mã thử nghiệm (nó được thực hiện trước và tách biệt với mã thực tế, phải không?) Để xem chức năng thay đổi như thế nào?

@MichaelT Cơ sở mã dành cho cơ sở mã kiểm tra tự động của chúng tôi. Chúng tôi sắp bắt đầu làm việc với một bổ sung mới cho dự án của chúng tôi có thể sẽ cần một số phát triển song song một chút. Do đó các cuộc thảo luận của các nhánh tính năng so với những người khác.
joshin4colours

7
Có phải mọi người thực sự gặp phải loại vấn đề này, hay họ chỉ sợ những vấn đề đó có thể xuất hiện?
Christopher Creutzig

2
Bằng cách này, hướng dẫn TUYỆT VỜI mà bạn đã liên kết đến :)
Vorac

1
Khởi động lại nhánh tính năng hoặc hợp nhất nó với kết quả trung kế trong các kết hợp tương tự. Rebasing thực sự hợp nhất nhiều hơn và như vậy có nhiều khả năng tạo ra xung đột xấu. Điều quan trọng là mức độ thường xuyên được thực hiện.
Jan Hudec

Câu trả lời:


23

Vấn đề không phải là mã của bạn. Nếu cơ sở mã của bạn có nhiều mối quan hệ giữa các mô-đun, thì mọi thay đổi sẽ có các đường gân ở mọi nơi và mọi nhà phát triển tương tác với mã của bất kỳ ai khác, đó sẽ là một cơn ác mộng.

Tôi có xu hướng nghĩ rằng bạn nhận thấy điều này theo những cách khác trước, nhưng có thể là bạn đã quen với nó đến mức bạn không thể nhìn thấy nó nữa.


9
Đây là suy nghĩ đầu tiên của tôi. Xung đột hợp nhất phức tạp xảy ra khi nhiều thay đổi được thực hiện cho cùng một mã. Nếu bạn có một dự án khá trẻ thì điều này là phổ biến, nhưng nếu bạn có một cơ sở mã có kích thước tốt thì đây có thể là dấu hiệu của "đối tượng thần" hoặc một số mô-đun / lớp đang làm quá nhiều và cần phải được cấu trúc lại. Nó cũng có thể xuất phát từ những ủy viên quá nhiệt tình thực hiện hàng tá thay đổi nhỏ, nhưng điều đó ít phổ biến hơn.
TMN

1
Thực tế cơ sở mã của chúng tôi hơi "trẻ" (khoảng 6 tháng tuổi, đã trải qua một số nhà tái cấu trúc lớn) có thể là một chỉ số cho điều này.
joshin4colours

10
@ joshin4colours Nếu bạn đang tái cấu trúc trong khi ai đó đang viết một tính năng lớn, bạn sẽ gặp rắc rối.
Sean McS Something 16/08/13

17

Tôi đã quen với quy trình "tìm nạp-rebase-đẩy". Đó thực sự là quy trình đầu tiên, nguyên thủy nhất, được mô tả trong hướng dẫn của bạn. Đây là những lợi thế:

  • Tích hợp liên tục thực sự
  • Quản lý xung đột sớm - ngay sau khi người ta đã viết và kiểm tra mã
  • Phản ứng nhanh chóng - "-Hey, Bob, phép nội suy bậc ba mà bạn đã viết mang lại kết quả hài hước, bạn có thể nhìn vào nó khi tôi đang ăn trưa không?"
  • Không có cam kết hợp nhất - dòng thời gian sạch như thể một nhà phát triển đã viết everithyng

Bây giờ, liên quan đến xung đột hợp nhất phức tạp. Tôi không hiểu làm thế nào người ta có thể trải nghiệm cả hai sự hợp nhất thường xuyên phức tạp. Biến chứng phát sinh từ việc không nổi loạn / hái anh đào trong một thời gian dài, làm việc trên tính năng đơn độc đó trong một tháng.

Cá nhân tôi thích giải quyết các xung đột thường xuyên, dễ dàng (thực sự là rebase), thay vì kinh dị hợp nhất hiếm gặp, bao gồm tất cả.


1
Mô tả tuyệt vời về quy trình làm việc Git tốt, nhưng điều này không hoàn toàn trả lời câu hỏi của tôi.
joshin4colours

2
@joshy đây là sự thật. Chỉ có loại đoạn giữa của địa chỉ câu hỏi của bạn. Nhưng đây là một câu trả lời trực tiếp. Nếu việc hợp nhất là thường xuyên khó khăn, thì đây chắc chắn là một dấu hiệu của quy trình công việc có vấn đề / vấn đề giao tiếp / vấn đề kiến ​​trúc / phân chia hoặc vấn đề vai trò.
Vorac

7

Sáp nhập và nổi loạn sẽ gây ra những xung đột chính xác giống nhau, đối với những xung đột vốn có mà một con người phải giải quyết (tức là hai nhà phát triển thay đổi cùng một dòng mã). Đối với các xung đột khác, việc hợp nhất thực sự có xu hướng sạch hơn, bởi vì bạn không thay đổi SHA-1 của các cam kết ở mọi nơi. Tôi không chắc làm thế nào bạn quản lý để đi vào trạng thái hợp nhất gây ra nhiều xung đột hơn là nổi loạn, nhưng chắc chắn đó là dấu hiệu cho thấy quy trình làm việc của một số người bị rối tung và họ có thể cần được đào tạo nhiều hơn về cách hoạt động của git. Có phải họ đang loại bỏ các cam kết hợp nhất của người khác khi họ thực hiện các cuộc nổi loạn tại địa phương của họ, hoặc một cái gì đó tương tự?

Lợi ích và nhược điểm của phương pháp pull-rebase là nó rất giống với quy trình làm việc tập trung mà nhiều người đã quen. Bạn không cần phải phân nhánh để sử dụng nó.

Ở mức độ nào, việc thực hiện một quy trình chi nhánh tính năng là hoàn toàn khả thi nếu bạn không thể khiến người khác đăng nhập vào đó.


5

Thỉnh thoảng, dự án tôi đang thực hiện có loại vấn đề này và dường như xuất phát từ một vài yếu tố:

  • Chúng tôi đang sử dụng Visual Studio và các tệp như Visual Studio .sln chỉ là các tài liệu XML (không đáp ứng tốt với các kết hợp văn bản) có đầy đủ các Hướng dẫn (mà Git không thể hiểu rõ hơn phần còn lại của chúng tôi) và có thể dễ dàng sáp nhập kém và làm cho các tập tin bị mất.
  • Một số người đang làm việc trên các khu vực tương tự của mã, để các thay đổi được đẩy có thể ở ngay cạnh nhau trong các lớp. Mặc dù không thể tránh khỏi trong tình huống này, loại cấu hình này sẽ rất khó cho bất kỳ hệ thống kiểm soát nguồn nào. Ngay cả khi bạn có sự giao tiếp tuyệt vời trong nhóm của mình, đôi khi mọi người sẽ không nhận ra rằng họ đang va vào mã của nhau và xung đột nảy sinh.

Tôi quan tâm đến tiềm năng của Semantic Merge để giúp giải quyết một số vấn đề đó, nhưng rõ ràng đó chỉ là sử dụng nếu bạn làm việc với ngôn ngữ mà nó có thể phân tích được và tôi chưa gặp phải bất kỳ thách thức đáng kể nào khi tôi Tôi đang sử dụng nó, vì vậy tôi không thể chứng minh tính hiệu quả của nó.


4

Trừ khi các nhà phát triển đang sửa đổi các cam kết lịch sử (thay vì hợp nhất thuần túy), các xung đột trong mô hình git loại công việc tính năng là dấu hiệu của một cơ sở mã hóa được liên kết chặt chẽ (/ brandnew codebase) hoặc gán tính năng chồng chéo.


0

Bạn có một nhánh chính (chính) và mọi người đều làm việc trong các nhánh tính năng của họ.

Làm việc trong các nhánh tính năng có thể mất bất cứ điều gì từ vài giờ đến vài tháng.

Thỉnh thoảng ai đó sẽ đảo ngược hợp nhất các thay đổi của họ trở lại vào nhánh chính. Trưởng nhóm của bạn cần đảm bảo rằng chỉ có một người thực hiện hợp nhất ngược lại tại một thời điểm. Khi điều này đã được thực hiện, bạn cần chuyển tiếp hợp nhất từ ​​nhánh chính vào nhánh tính năng của bạn. Khi mọi người thực hiện hợp nhất về phía trước, một người khác có thể được phép đảo ngược hợp nhất thành chi nhánh chính. Nếu không, quá nhiều thay đổi sẽ được hợp nhất ngược lại và bạn sẽ có vô số xung đột hợp nhất trong hợp nhất chuyển tiếp của mình.

Chỉ để làm rõ thuật ngữ, bằng cách "hợp nhất ngược" Tôi có nghĩa là hợp nhất từ ​​nhánh tính năng thành nhánh chính và bằng "hợp nhất chuyển tiếp" Tôi có nghĩa là hợp nhất từ ​​nhánh chính thành nhánh tính năng. Dựa trên những gì tôi đã trải nghiệm trước đây, bạn có thể thấy nhiều xung đột hợp nhất hơn khi hợp nhất ngược lại, trái ngược với hợp nhất chuyển tiếp.


1
Sáp nhập vào nhánh chính không bao giờ có bất kỳ xung đột nào. Bạn luôn hợp nhất chính thành tính năng đầu tiên, vì vậy tính năng thành chính sau đó không xung đột.
gnasher729

@ gnasher729 - Tôi nghĩ đó là những gì câu trả lời này của nói đến - những gợi ý như tôi nhìn thấy nó là tất cả các nhà phát triển hòa trộn từ chính đối với các ngành chức năng của họ mỗi khi có ai cam kết bất cứ điều gì để chính, vì vậy mà tất cả các cuộc xung đột ngay lập tức được giải quyết trên các ngành chức năng.
Periata Breatta

Anh ấy nói "bạn có nhiều khả năng có xung đột khi hợp nhất từ ​​tính năng thành chủ"
gnasher729

0

Hai điều có thể giúp: Một, tránh mọi công cụ tự thay đổi. Hai nhà phát triển sử dụng các cài đặt tab khác nhau là một công thức cho thảm họa. Hai, thay đổi ở các địa điểm khác nhau. Bạn gặp một vấn đề chẳng hạn nếu ba nhà phát triển thêm mã vào cuối cùng một tệp - tốt hơn nhiều nếu họ thêm mã ở những nơi khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.