Kéo thay đổi từ chủ đến chi nhánh công việc của tôi?


16

Có hai chúng tôi làm việc gì đó. Chúng tôi đang sử dụng cấu trúc chi nhánh này

  • bậc thầy
  • nhà phát triển
  • dev-B

Cả hai chúng tôi đều làm việc trên các nhánh riêng biệt (dev-A, B) và bất cứ khi nào chúng tôi hoàn thành - chúng tôi thúc đẩy các thay đổi của mình thành chủ.

Nhưng nhược điểm của việc này là chúng tôi không thể nhận được những thay đổi mà nhà phát triển khác thực hiện. Mọi thứ tồn tại trong cây chủ - nhưng chúng tôi không thể nhận được các bản cập nhật mới nhất mà nhà phát triển khác đã thực hiện.

Có cách nào để giải quyết vấn đề này hay chúng ta nên thay đổi cấu trúc chi nhánh (theo tính năng?)?

Câu trả lời:


16

Tôi đã thấy các nhánh nhà phát triển được sử dụng trong hai kịch bản chính:

  1. Cộng đồng nguồn mở, nơi các nhánh này thực sự là các nhánh kho lưu trữ, để những người duy trì dự án có thể khóa truy cập vào kho lưu trữ chính và yêu cầu tích hợp thông qua các yêu cầu kéo. Điều này làm cho cuộc sống của những người đóng góp trở nên khó khăn hơn, nhưng dễ dàng hơn nhiều cho những người bảo trì, tất nhiên đó là điểm chính xác, và đây là một mô hình rất thành công trên GitHub.

  2. Các nhóm và tổ chức không có sự tích hợp liên tục và hồ sơ theo dõi về sự không ổn định trong việc triển khai của họ, hoặc tệ hơn là sự không ổn định trong các bản dựng của họ. Các nhóm này thường cố gắng sử dụng các nhánh nhà phát triển như một cách để bảo vệ sự ổn định của tuyến chính, và kết quả là - thông thường - một giai đoạn hợp nhất dài và rất đau đớn trước khi phát hành, sau đó là một giai đoạn ổn định lâu hơn và đau đớn hơn, đôi khi không xảy ra cho đến sau khi phát hành.

Tôi không muốn đây là một lời ca ngợi về lý do tại sao bạn cần CI, nhưng rõ ràng từ câu hỏi của bạn rằng bạn biết rằng bạn không tích hợp các thay đổi của mình đủ thường xuyên, vì vậy IMO không có vấn đề gì trong việc giải quyết vấn đề.

Trừ khi bạn thực sự làm việc trong một nhóm phân phối theo địa lý có nhu cầu "chuyển" các thay đổi từ các nhà phát triển bên ngoài, mô hình chi nhánh cho mỗi nhà phát triển thực sự không có ý nghĩa nhiều. Nó đặc biệt không có ý nghĩa với git, vì mỗi nhà phát triển đã về mặt kỹ thuật có kho riêng / mình. Hầu hết các tổ chức nên được tích hợp rất thường xuyên - như trong, vài lần mỗi ngày.

Tôi hiện đang là thành viên của một nhóm khoảng 35 người đóng góp được chia thành 4 nhóm riêng biệt, hầu hết mọi người đăng ký ít nhất 2-3 lần một ngày, một số người từ 10 - 15 lần; Thật bất thường khi thấy các bản dựng bị hỏng và cực kỳ hiếm khi chúng bị hỏng trong hơn một vài phút. Git xử lý hợp nhất rất dễ dàng trong hầu hết thời gian mà các nhánh nhà phát triển từ xa chỉ là chi phí không cần thiết. Chỉ cần kéo, hợp nhất cục bộ và chạy thử nghiệm cam kết trước khi bạn đẩy, thật đơn giản.

Nếu bạn hoàn toàn phải trì hoãn tích hợp để bảo vệ sự ổn định của nhánh chính, mô hình đã được chứng minh, điển hình là sử dụng nhánh không ổn định - đôi khi được gọi là nhánh phát triển , như được mô tả trong Mô hình phân nhánh Git thành công . Nếu các nhà phát triển không thể hợp nhất thành công vào chi nhánh này (chỉ cần xây dựng , không chạy hoàn hảo) ít nhất một lần một ngày, thì bạn có vấn đề về chất lượng / kỷ luật và không phải là vấn đề kiểm soát sửa đổi; che đậy nó bằng cách sử dụng các nhánh nhà phát triển không tích hợp chỉ khắc phục vấn đề và bằng cách đó, thực sự làm cho sự hợp nhất cuối cùng trở nên đau đớn và không ổn định hơn nhiều so với thực tế.

Các nhánh tính năng không phải là tồi tệ nhất, nhưng IMO rất ít dự án thực sự đủ lớn để đảm bảo chúng; nếu dự án của bạn rất lớn (tức là hàng tấn các tính năng đang được xử lý cùng một lúc) thì bạn sẽ thấy kết quả tốt hơn từ việc tách nó thành các thành phần tự trị riêng biệt so với việc bạn vượt qua vấn đề với kiểm soát nguồn.

Bạn có thể bỏ qua lời khuyên này nếu bạn muốn, và nhiều nhóm thực hiện, nhưng một trong những lý do mô hình phân nhánh được liên kết ở trên rất phổ biến và thành công là nó được thiết kế để hoạt động với tích hợp liên tục, không chống lại nó.


Tôi nghĩ tầm quan trọng của việc tích hợp liên tục không thể được nhấn mạnh đủ, cả về ý nghĩa tích hợp mọi thứ vào một nhánh và theo nghĩa là xây dựng hàng ngày / hàng giờ (sử dụng Jenkins hoặc tương tự).
sleske

15

Trong chi nhánh làm việc của bạn nếu bạn đi:

git commit -am "Committing changes before merge"
git merge master

bạn cũng có thể hợp nhất từ ​​nhánh nhà phát triển khác

git checkout dev-A
git merge dev-B

Những gì sẽ làm là hợp nhất các thay đổi trong tổng thể vào nhánh phát triển của bạn.


Vâng - đó là một cách. Tôi đã hy vọng git sẽ có một quy trình làm việc thanh lịch cho việc này.
Utkarsh Sinha

2
Vâng git thường hoạt động tốt nhất nếu mỗi nhà phát triển có kho lưu trữ công việc cục bộ của riêng họ và kho lưu trữ trung tâm được chia sẻ mà các nhà phát triển đẩy và lấy từ đó. Bằng cách đó, mỗi bạn có thể làm việc trong cùng một nhánh và nhận các bản cập nhật bằng cách kéo và đặt các thay đổi bằng cách đẩy vào kho lưu trữ trung tâm. Đó có lẽ là sự thanh lịch mà bạn đang tìm kiếm. git sẽ tự động xử lý việc hợp nhất cho bạn trừ khi có xung đột. git Flow là một bổ sung tốt đẹp cho quy trình làm việc.
rùng rợn

Hoàn hảo. Có một số câu trả lời rất dài cho câu hỏi chính xác này ở một vài nơi, nhưng git merge mastertrong khi trên nhánh tính năng đã kiểm tra là những gì tôi đang tìm kiếm. Cảm ơn
Drenai

3

Nếu dev-A và dev-B là các nhánh khác nhau cho dự án khác nhau thì những gì @scaryrawr trả lời sẽ là tốt nhất.

Nhưng nếu dev-A và dev-B thực sự chính xác là cùng một mã (cùng một dự án) thì một giải pháp thay thế sẽ là cả hai đều hoạt động trên một trong các nhánh. Ví dụ: bạn tạo một nhánh tắt master gọi là 'devWork'. Cả hai bạn đều kiểm tra devWork, làm việc với nó, cam kết và đẩy các thay đổi. Các thay đổi được đẩy sẽ không có trên Master mà trong devWork, sau đó những người dùng khác của chi nhánh chỉ cần thực hiện PULL cục bộ để được thay đổi đẩy.

Sau đó, bạn có thể làm theo các phương pháp tiêu chuẩn để hoàn thành công việc trên devWork trở lại Master, v.v.

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.