Có phải tốt hơn để hợp nhất các nhóm thường xuyên hay chỉ sau khi hoàn thành một sự hợp nhất lớn của các nhánh tính năng?


40

Giả sử nhiều nhánh đang được phát triển, AB, cũng như một nhánh "sửa lỗi" gia tăng C.

Bây giờ Cđã "hoàn thành" và sáp nhập vào chủ. ABvẫn đang trong quá trình phát triển và sẽ không được sửa trước khi (có thể) một nhánh sửa lỗi khác được sáp nhập vào master.

Có phải là một ý tưởng tốt để hợp nhất Ccàng sớm càng tốt trong các nhánh tính năng mới? Vì vậy, các tính năng mới ở càng gần mastercàng tốt? Hoặc tốt hơn là để cho tính năng mới được phát triển trong "thế giới" của riêng họ chỉ hợp nhất thành chủ sau khi hoàn thành?

Dù sao cũng sẽ có xung đột, vì vậy cần có thời gian để sửa chúng.



5
@gnat đó là về việc hợp nhất các nhánh tính năng thành một dòng chính, tôi tự hỏi liệu việc hợp nhất trở lại tính năng trong khi tính năng đang được phát triển có tốt không, để "giải quyết xung đột sớm".
paul23

1
@ paul23, tôi muốn nói rằng đó là một điều cần thiết thực tế.
Berin Loritsch

3
Thành thật mà nói, rất nhiều vấn đề về phiên bản của tôi đã biến mất khi tôi bắt đầu sử dụng thiết kế phù hợp trên mã của mình, như cách ly các mô-đun và tạo ra một mô hình công việc được xác định rõ. Nếu bạn vấp ngã quá nhiều về các vấn đề trong quá trình hợp nhất, bạn có thể có một vấn đề khác nghiêm trọng hơn đang ẩn giấu ở đâu đó. Một thiết kế tốt là vô cùng hữu ích trong việc tránh xung đột không liên tục.
T. Sar - Phục hồi

2
Bạn có thể muốn hợp nhất từ ​​chủ thường xuyên để ở gần "đủ" để không làm cho việc hợp nhất sau này quá đau đớn.
Thorbjørn Ravn Andersen

Câu trả lời:


71

Một nhánh sống càng lâu, nó càng có khả năng phân kỳ khỏi nhánh chính và sự kết hợp phức tạp và phức tạp hơn sẽ xảy ra khi cuối cùng nó kết thúc. Mười xung đột nhỏ dễ giải quyết hơn 1 xung đột lớn và thực sự có thể ngăn các nhà phát triển nhân đôi hoặc lãng phí nỗ lực. Cho rằng, bạn nên hợp nhất mastervào ABthường xuyên; một lần một ngày là một đề xuất khá phổ biến, mặc dù nếu bạn có nhiều hoạt động trên các chi nhánh của mình, bạn có thể muốn hợp nhất nhiều lần trong ngày.

Ngoài việc làm cho giải quyết xung đột dễ dàng hơn, bạn đề cập cụ thể Clà một nhánh lỗi. Là nhà phát triển, tôi muốn chi nhánh của mình có tất cả các lỗi mới nhất, để đảm bảo tôi không lặp lại hành vi dẫn đến lỗi hoặc viết các bài kiểm tra dựa trên dữ liệu sai.

Dù sao cũng sẽ có xung đột, vì vậy cần có thời gian để sửa chúng.

Nếu bạn biết sẽ có xung đột, bạn có thể muốn áp dụng một chiến lược phân nhánh khác. Giữ nhiều thay đổi cho cùng một (các) tệp trên cùng một nhánh bất cứ khi nào có thể và bạn giảm hoặc loại bỏ số lượng xung đột. Câu chuyện tái cấu trúc sao cho chúng hoàn toàn độc lập hết mức có thể và làm lại các nhánh để có thể bao quát nhiều câu chuyện (nhánh, tính năng và câu chuyện không phải lúc nào cũng có thể thay thế cho nhau).


33
Hợp nhất hoặc rebase , vì việc nổi loạn thường tạo ra một lịch sử cam kết sạch hơn.
chrylis -on đình công-

11
@chrylis: Rebasing có thể nguy hiểm nếu "các nhánh bao gồm các câu chuyện khác nhau" có nghĩa là hai nhà phát triển làm việc trên cùng một nhánh.
meriton - đình công

9
@meriton từ các tài liệu chính thức: Không rebase các cam kết tồn tại bên ngoài kho lưu trữ của bạn và mọi người có thể đã làm việc dựa trên chúng. Nếu bạn làm theo hướng dẫn đó, bạn sẽ ổn thôi. Nếu bạn không, mọi người sẽ ghét bạn và bạn sẽ bị bạn bè và gia đình khinh miệt. LOL
Xtreme Biker

6
@XtremeBiker: Một cuộc nổi loạn trong Git thay đổi lịch sử. Git hoạt động như đời thực trong vấn đề này: để thay đổi lịch sử, bạn cần một âm mưu. Có một nhánh trong kho lưu trữ cho chính Git thường xuyên bị phản đối và nó là một nhánh rất công khai. Lý do điều này hoạt động là có một âm mưu: mọi người sử dụng chi nhánh này đồng ý viết lại lịch sử vào những thời điểm nhất định, vì vậy họ sẽ đảm bảo rằng họ đang ở trong một vị trí để mọi thứ được hợp nhất bởi những thời điểm đó.
Jörg W Mittag

1
@ paul23 Nghiêm túc xem xét việc cung cấp A và B cho một chi nhánh được chia sẻ mới trước khi giao chúng cho chủ. Nếu cả hai đều đại tu triệt để, bạn muốn họ cùng nhau tham gia một vòng thử nghiệm trước khi thực hiện kết hợp với chủ. Nếu bạn tự tin, bạn có thể giao một cái trực tiếp cho chủ và sau đó chuyển cái kia đến một chi nhánh mới được cập nhật. Bạn có thể muốn có thể xem mã gốc từ tính năng thứ hai trong trường hợp hợp nhất bị hỏng hoặc bạn cần thiết kế lại một cái gì đó.
Trân trọng

11

Giả sử ý định của bạn là cuối cùng hợp nhất A, B trở lại thành chủ và duy trì một cơ sở mã duy nhất, không bao giờ là một ý tưởng tốt để đi chệch khỏi chủ quá xa. Đi chệch khỏi chủ quá lâu, đặc biệt là khi sửa lỗi và phát triển khác đang hợp nhất thành chủ vì A, B đang được phát triển, chắc chắn sẽ gây ra xung đột.

Tôi sẽ xem xét các chiến lược tương tự như sau

  1. Bất cứ ai chịu trách nhiệm về A, B nên theo dõi tổng thể chặt chẽ và hợp nhất trong mọi thay đổi.
  2. Tốt hơn nữa, nếu bạn có bản dựng và kiểm tra tự động hóa, hãy đảm bảo A, B hợp nhất thành chủ và vượt qua các bài kiểm tra hàng đêm.
  3. Dựa vào bạn nhận xét câu trả lời khác, dường như A, B có thể mất một thời gian để phát triển. Trong trường hợp này, bạn thậm chí có thể cân nhắc để có A, B hợp nhất với nhau để cuối cùng bạn không gặp khó khăn lớn khi hợp nhất cả hai trở lại thành chủ.
  4. Ở cấp độ cao hơn, hãy nghĩ về lý do tại sao bạn cần 2 dòng phát triển dài riêng biệt. Bạn có thể chia thành các sáp nhập nhỏ hơn? Bạn có thể đột nhập vào các dịch vụ vi mô riêng biệt?

5

Thường thường là tốt hơn so với một đồ sộ.

Yêu cầu kéo nhỏ hơn, thường xuyên hơn, hầu như luôn luôn tốt hơn.

Tôi đã bắt đầu sử dụng các cờ cấu hình chủ yếu để tôi có thể thực hiện sớm các yêu cầu kéo nhỏ hơn để lần lượt tôi có thể hợp nhất mã dễ dàng hơn, nhưng để lại tính năng bị vô hiệu hóa. Yêu cầu kéo càng nhỏ, càng dễ xem lại mã, ngay cả khi có nhiều yêu cầu kéo hơn. Hầu hết mọi người dưới mọi hình thức sẽ không thể thực hiện đánh giá có ý nghĩa về các yêu cầu kéo lớn. Thật khó khăn cho RAM tinh thần của một người để hiểu tất cả những tác động có thể có của một sự thay đổi mã lớn.

Có thêm chi phí trong việc tạo cờ cấu hình, vì vậy nó không xứng đáng với các tính năng nhỏ hơn. Nhưng sau đó yêu cầu kéo của bạn sẽ nhỏ.

Tuy nhiên, có thể có các tình huống trong đó tính năng phải được phát hành cùng một lúc. Thậm chí sau đó có thể tốt hơn để thực hiện các yêu cầu kéo nhỏ hơn đến một chi nhánh khác được thực hiện cho mục đích đó.

Hầu hết các đồng nghiệp của tôi than vãn khi ai đó tạo ra một yêu cầu kéo lớn, và đối với hầu hết các phần, đúng như vậy.

Cũng lưu ý rằng đôi khi tôi cần phải hái anh đào vào một nhánh riêng. Nếu những gì cần được hái anh đào có thể được đưa vào một cam kết duy nhất thì việc di chuyển nó sang các nhánh khác sẽ dễ dàng hơn. Đây là một trường hợp thực sự có ít cam kết là tốt hơn, nhưng nó không chính xác là quy trình tiêu chuẩn nếu bạn hái anh đào xung quanh.


1
Cờ tính năng có thể tốn kém (450 triệu USD trong 45 phút). Ví dụ này cũng được chú Bob nhắc đến (nhưng không có bất kỳ kỹ thuật nào (như người ta mong đợi)).
Peter Mortensen

1
Vâng, cuối cùng có loại bỏ chúng, mặc dù nó thường không khó lắm. Người ta có thể duy trì chúng lâu hơn, nhưng sau đó cờ sẽ cung cấp một số cách sử dụng lớn hơn. Tôi đồng ý nếu thực hiện hapazardly hoặc không theo dõi, sau đó mọi thứ có thể trở nên tồi tệ. Mặc dù mọi thứ có thể trở nên tồi tệ khi một yêu cầu kéo lớn trở nên khó xem xét. Mặt khác, một số người có thể không ở vị trí để thêm một cái gì đó giống như cờ cấu hình vào ứng dụng họ đang làm việc. Nói chung, nó giúp với UAT và triển khai một tính năng.
Mark Rogers

3

Trong Tái cấu trúc của Martin Fowler, lời khuyên mà ông đưa ra là đừng bao giờ để một nhánh được tách khỏi chủ trong thời gian dài hơn một ngày. IIRC, bạn nên thực hiện một thay đổi nhỏ, kiểm tra để đảm bảo rằng bạn không phá vỡ bất cứ thứ gì, và sau đó hợp nhất lại.


2
Vâng ABtổ chức đại tu mới triệt để về cách ứng dụng hoạt động, chúng không được "thực hiện" trong vòng một tháng. Tuy nhiên, chúng cũng vô dụng trước khi chúng được thực hiện ...
paul23

8
Chúng có thể không vô dụng trước khi chúng được thực hiện - chúng cung cấp giá trị bằng cách là một bước tiến tới kết quả đầy đủ và giảm công việc cần thiết trong tương lai. Sử dụng các kỹ thuật như bật tắt tính năng, phân nhánh bằng cách trừu tượng hóa hoặc chỉ đơn giản là thực hiện phần giao diện người dùng cuối cùng, có thể hợp nhất một cách an toàn với công việc chưa hoàn thành để làm chủ.
bdsl

1
đó là lý do tại sao việc nổi loạn cục bộ của bạn trên bất kỳ thay đổi nào trong nhánh chính là thuận tiện để phát triển lâu dài. Giữ công việc của bạn như thể nó vừa được phân nhánh mới nhất
NKCampbell

2

Một tùy chọn khác cho các thay đổi thực sự tồn tại lâu có thể kết thúc nhưng chưa sẵn sàng để sử dụng là đặt chúng phía sau một cờ tính năng để chúng có thể được hợp nhất để làm chủ nhưng không có nguy cơ phá vỡ bất cứ điều gì. Sau đó, khi chúng đã sẵn sàng để sử dụng, cờ tính năng có thể được gỡ bỏ.


1
Cờ tính năng = mã zombie (cho đến khi hồi sinh)?
Peter Mortensen

@PeterMortensen Vâng, bạn phải đặt mục tiêu xóa cờ càng sớm càng tốt nhưng nó có thể hoạt động trong một số trường hợp nhất định
Qwertie

3
@PeterMortensen không nếu cờ được bật cho ít nhất một người
Ian
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.