Xử lý một yêu cầu kéo lớn


15

Tôi hiện đang làm việc trong một dự án với một nhóm sử dụng quy trình công việc git. Nó khá đơn giản, chủ nên ở trạng thái có thể triển khai và các nhánh được sử dụng để tạo các tính năng và hotfix. Bất cứ khi nào chúng tôi có một tính năng hoặc sửa lỗi hoàn thành và được kiểm tra thì chúng tôi sẽ chuyển nó sang chủ ngay khi có thể. Ý tưởng là các nhánh nên càng nhỏ càng tốt để dễ dàng hợp nhất chúng trở lại thành chủ. Chúng tôi có một chính sách rằng bất kỳ mã nào được đẩy lên nhánh chính phải ở trạng thái có thể triển khai và vượt qua các thử nghiệm.

Chúng tôi đã có một tình huống trong đó một trong những nhà phát triển đã thực hiện rất nhiều công việc (trị giá vài tháng) trên một chi nhánh và chi nhánh này chưa được sáp nhập trở lại thành chủ. Hiện tại có một vài tính năng riêng biệt và một loạt các cam kết trên chi nhánh này, về cơ bản, chi nhánh này thực sự đã được sáp nhập trở lại trong một vài lần nhưng cho đến nay vẫn chưa có. Hầu hết các mã ở trạng thái tốt với các bài kiểm tra đơn vị có thể được hợp nhất trở lại thành chủ nhưng những thay đổi gần đây nhất chắc chắn không phải là vì chúng chưa được hoàn thành và không được kiểm tra.

Cách tốt nhất để đối phó với tình huống như vậy khi một chi nhánh thực sự cách xa các chi nhánh khác là gì? Những cách nào chúng ta có thể tránh các chi nhánh nhận được một số lượng lớn các cam kết từ chủ trong tương lai?


Đây là trong một dự án kinh doanh hoặc nguồn mở? Tôi nghĩ rằng câu trả lời về cách xử lý nó sẽ khác nhau. Nếu kinh doanh, sau đó nó chỉ ra một số vấn đề quá trình. Nếu đó là công việc nguồn mở thì bạn muốn xử lý nó theo cách khác.
Daenyth

@Daenyth Tình huống đặc biệt này là trong bối cảnh kinh doanh. Tôi quan tâm đến những gì bạn nghĩ rằng cách tiếp cận tốt nhất sẽ là trong một dự án nguồn mở.
đưa đón87

Câu trả lời:


12

Hãy để nhà phát triển đã đi trong một vài tháng mà không hợp nhất sửa nó. Có lẽ họ có thể lấy một đoạn mã lớn để hợp nhất, có thể họ có thể lấy một loạt các đoạn nhỏ để hợp nhất một lần. Trong mọi trường hợp, họ nên làm việc đó để khắc phục vấn đề, vì họ đã gây ra nó.

Cách tốt nhất để đối phó với tình huống như vậy khi một chi nhánh thực sự cách xa các chi nhánh khác là gì?

Nói chung, đừng lo lắng về điều đó: đó là vấn đề của nhà phát triển khác. Nếu hai nhánh thực sự quá xa nhau để hợp nhất, thì chúng không thực sự là một phần của cùng một dự án nữa và bạn có một ngã ba defacto. Nếu đó là một dự án nguồn mở, điều đó thậm chí có thể không thành vấn đề.

Nếu nhà phát triển này thực sự xuất sắc và mã của họ tốt hơn / thông minh hơn / quan trọng hơn so với phần còn lại của nhóm kết hợp, thì đáng để biến nó thành vấn đề của bạn thay vì của họ. Nếu không, nó không phải là.

Để trả lời câu hỏi theo nghĩa đen: cách tốt nhất để đối phó với loại tình huống này là không gặp tình huống đó.

Những cách nào chúng ta có thể tránh các chi nhánh nhận được một số lượng rất lớn các cam kết từ chủ trong tương lai?

Hãy chắc chắn rằng tất cả mọi người thông báo rằng nhà phát triển đã đi trong nhiều tháng mà không hợp nhất sẽ phải khắc phục sự cố mà họ gây ra. Hãy chắc chắn rằng mọi người đều biết rằng việc cam kết làm chủ thường xuyên sẽ không thường xuyên hơn, vì ít thay đổi hơn đồng nghĩa với ít cơ hội hơn cho các xung đột.

Hãy chắc chắn rằng mọi người biết rằng họ có thể kéo từ chủ để cập nhật những thay đổi của người khác.

"Nếu bạn hợp nhất mỗi ngày, đột nhiên bạn không bao giờ đến mức bạn có những xung đột lớn khó giải quyết." --Linus Torvalds

Câu nói đó là từ một bài nói chuyện mà anh ấy đã đưa ra tại Google, đây là bản dịchđây là video .


2

Nếu bạn có một cam kết mà bạn biết điều này và tất cả các cam kết trước đó đều được kiểm tra tốt và nên được hợp nhất, thì chỉ cần phân nhánh từ cam kết tốt cuối cùng này và hợp nhất chi nhánh mới với chủ.

Nếu bạn có một số cam kết mà bạn muốn hợp nhất, nhưng chúng được xen kẽ với các cam kết khác không sẵn sàng sản xuất, thì tôi thấy 2 khả năng:

  1. Tạo chi nhánh mới và anh đào chọn những cam kết tốt, hợp nhất với chủ.
  2. Cố gắng loại bỏ các cam kết không mong muốn lên đầu (có thể trên nhánh mới chỉ để an toàn).

Đối với các phương pháp phòng ngừa, hãy cố gắng xác định một số quy tắc nhóm vui nhộn như "Một quy tắc không hợp nhất với chủ trong vòng một tuần sẽ đặt bánh pizza trong một tháng".


1

Đầu tiên, hãy xem liệu thực sự có những cam kết riêng biệt có thể được hợp nhất hoặc chọn anh đào, như đề xuất của @Maciej Chalpuk. Nếu đây là trường hợp, thì tình hình thực sự không tệ đến thế và tôi sẽ không lo lắng quá nhiều về nó trong tương lai.

Tuy nhiên, nếu tình hình thực tế là nhiều tính năng đã được phát triển đồng thời trong một nhánh, trong cùng một cam kết, thì nó sẽ trở thành một nỗi đau lớn hơn nhiều để giải quyết. May mắn thay, phương pháp phòng ngừa được tích hợp sẵn: yêu cầu nhà phát triển tách các thay đổi cho từng tính năng thành các nhánh riêng biệt và kéo các yêu cầu trước khi hợp nhất chúng. Bạn sẽ nhận được sự hợp nhất nguyên tử của mình, cũng như không cho nhà phát triển này thực hiện tương lai.

Quá trình thực tế tách ra các tính năng là hoàn toàn thủ công. Tạo các nhánh mới từ chủ và sao chép mọi thay đổi từ nhánh lớn có liên quan đến nó. Biên dịch, kiểm tra tính năng, đẩy và đưa ra yêu cầu kéo. Các thay đổi mã càng ít xen kẽ thì càng dễ thực hiện. Nếu anh ta đang hack một phương pháp duy nhất cho tất cả bọn họ, tốt, hãy vui vẻ. Anh ấy sẽ không làm điều đó một lần nữa.


1

Đây là một giải pháp đơn giản.

Theo dõi các tính năng mà người này đã triển khai và đi đến từng cam kết trên nhánh đó đã được cập nhật cho mỗi tính năng. Lấy cam kết này và hợp nhất nó với repo chính.

Hãy để tôi phá vỡ điều này dưới dạng một ví dụ.

Đặt: Nhánh A là nhánh từ nhánh chính A + = Nhánh A + tính năng mới 1 Nhánh A ++ = Nhánh A + tính năng mới 2 và cứ thế tiếp tục

Điều bạn cần làm là quay trở lại: Chi nhánh A +

Lấy nhánh A + và hợp nhất nó với Master.

Bây giờ hãy đến Branch A ++ và hợp nhất nó với (Master + Branch A +).

Lặp lại cho đến khi bạn đạt đến Chi nhánh A + ... + cuối cùng ổn định.

Phương pháp này thoạt nghe có vẻ phản trực giác, nhưng nếu bạn hợp nhất từng tính năng mới riêng biệt với chủ, nó sẽ dễ dàng chuyển đổi giữa nhánh chính " trên mỗi tính năng được thêm "

Những cách nào chúng ta có thể tránh các chi nhánh nhận được một số lượng rất lớn các cam kết từ chủ trong tương lai?

Tôi nghĩ rằng giải pháp của tôi ở trên chỉ ra phương pháp nào trong tương lai bạn nên áp dụng. Đi với một tính năng hoặc mỗi phương pháp nhiệm vụ cho mỗi chi nhánh.

Tôi sẽ đề nghị sử dụng một cách tiếp cận:

chủ và chủ

thạc sĩ: Cuối cùng / mức sản xuất. Được sửa đổi không thường xuyên. Được coi là luôn ổn định

pre-master: khu vực nơi một tính năng mới được thêm vào mã hiện có. Được kiểm tra kỹ lưỡng để làm việc với cơ sở mã hiện có và là nơi các chi nhánh khác có thể rẽ nhánh để triển khai tính năng mới.

Bạn cũng nên thử gói các tính năng và nhắm mục tiêu theo phiên bản.

Nhắm mục tiêu theo phiên bản: Chỉ định một số tùy ý sẽ đóng vai trò giữ chỗ cho nhánh chính. "Trong V1.0.0, chúng tôi sẽ muốn đạt được các tính năng X, Y, Z. V1.0.0 cũng sẽ có tất cả các chức năng này: ..."

Bằng cách duy trì một phiên bản chống lại chủ, nó cũng có thể là một cách để giữ cho "chủ" ổn định và sẵn sàng sản xuất mọi lúc.


0

Khắc phục sự cố của yêu cầu kéo lớn là một điều, và có một số câu trả lời tốt liên quan đến điều đó. Nhưng đối với việc xử lý các chi nhánh đã lỗi thời, bạn có thể muốn xem lại các quy trình của mình để xử lý công việc nhóm.

Nếu bạn đang làm việc trong khung Agile hoặc SCRUM, nhóm thực sự nên hỏi tại sao tính năng này chưa được hoàn thành và được hợp nhất như là một phần của lần lặp / chạy nước rút. Nếu nó "quá lớn" để phù hợp với một lần lặp, thì nó đã bị chia thành các phần nhỏ hơn.

Nó cũng đặt ra một câu hỏi về quyền sở hữu mã - trong nhóm của bạn, các nhà phát triển cá nhân có sở hữu công việc riêng của họ hay nhóm đầy đủ làm việc cùng nhau để đảm bảo rằng các mục được thực hiện không?

Tất nhiên, những điều trên giả định rằng nhóm của bạn nằm trong một số loại cấu trúc công ty. Nếu đây là một dự án nguồn mở với những người đóng góp tình nguyện, thì đó là một câu chuyện khác. Nói chung, các dự án như vậy có sự kiểm soát lỏng lẻo hơn đối với quy trình công việc, nhưng trách nhiệm tạo ra các yêu cầu kéo chấp nhận được thường xuyên hơn đối với các cá nhân đóng góp.

Theo nhiều cách, điều này trở thành một câu hỏi quá trình. Có thể quy trình cần thiết của bạn bao gồm kiểm tra định kỳ (hàng tuần? Hàng tháng?) Cho các chi nhánh dài hạn, không được hợp nhất. Một số công cụ làm cho điều này đơn giản để kiểm tra trực quan; ví dụ: trên github, hãy truy cập vào liên kết "các nhánh" và nó cho thấy khoảng cách phía trước / phía sau mỗi nhánh là bao xa.

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.