Chúng tôi đang thực hiện các dự án, nhưng chúng tôi sử dụng lại rất nhiều mã giữa các dự án và có rất nhiều thư viện chứa mã chung của chúng tôi. Khi chúng tôi thực hiện các dự án mới, chúng tôi tìm thấy nhiều cách hơn để xác định mã chung và đưa nó vào thư viện. Các thư viện phụ thuộc lẫn nhau, và các dự án phụ thuộc vào các thư viện. Mỗi dự án và tất cả các thư viện được sử dụng trong dự án đó, cần sử dụng cùng một phiên bản của tất cả các thư viện mà chúng đang đề cập. Nếu chúng tôi phát hành một phần mềm, chúng tôi sẽ phải sửa lỗi và có thể thêm các tính năng mới trong nhiều năm, đôi khi trong nhiều thập kỷ. Chúng tôi có khoảng một tá thư viện, các thay đổi thường cắt ngang hơn hai và một số nhóm làm việc song song với một số dự án, thực hiện các thay đổi đồng thời cho tất cả các thư viện này.
Gần đây chúng tôi đã chuyển sang git và thiết lập kho lưu trữ cho từng thư viện và từng dự án. Chúng tôi sử dụng stash như một kho lưu trữ phổ biến, thực hiện các công cụ mới trên các nhánh tính năng, sau đó thực hiện các yêu cầu kéo và hợp nhất chúng sau khi xem xét.
Nhiều vấn đề chúng ta phải giải quyết trong các dự án đòi hỏi chúng ta phải thay đổi trên một số thư viện và mã cụ thể của dự án. Chúng thường bao gồm những thay đổi của giao diện thư viện, một số trong đó không tương thích. (Nếu bạn nghĩ điều này nghe có vẻ tởm Ví dụ, hãy tưởng tượng một dự án P1
sử dụng các thư viện L1
, L2
và L3
. L1
cũng sử dụng L2
và L3
, và L2
sử dụng L3
là tốt. Biểu đồ phụ thuộc trông như thế này:
<-------L1<--+
P1 <----+ ^ |
<-+ | | |
| +--L2 |
| ^ |
| | |
+-----L3---+
Bây giờ hãy tưởng tượng một tính năng cho dự án này đòi hỏi phải thay đổi P1
và L3
thay đổi giao diện L3
. Bây giờ thêm các dự án P2
và P3
vào hỗn hợp, cũng tham khảo các thư viện này. Chúng tôi không thể đủ khả năng để chuyển tất cả chúng sang giao diện mới, chạy tất cả các thử nghiệm và triển khai phần mềm mới. Vì vậy, những gì thay thế?
- thực hiện giao diện mới trong
L3
- thực hiện một yêu cầu kéo
L3
và chờ xem xét - hợp nhất sự thay đổi
- tạo một bản phát hành mới của
L3
- bắt đầu làm việc với tính năng này
P1
bằng cách làm cho nó tham khảoL3
bản phát hành mới, sau đó triển khai tính năng này trênP1
nhánh tính năng của - thực hiện một yêu cầu kéo, xem xét và sáp nhập
(Tôi chỉ nhận thấy rằng tôi quên để chuyển đổi L1
và L2
việc phát hành mới. Và tôi thậm chí không biết được nơi để dính vào trong này, bởi vì nó sẽ cần phải được thực hiện song song với P1
...)
Đây là một quá trình tẻ nhạt, dễ bị lỗi và rất dài để thực hiện tính năng này, nó đòi hỏi phải đánh giá độc lập (khiến việc đánh giá khó khăn hơn nhiều), không mở rộng quy mô và có khả năng khiến chúng tôi không hoạt động vì chúng tôi bị sa lầy trong quá trình chúng tôi không bao giờ hoàn thành công việc.
Nhưng làm thế nào để chúng tôi sử dụng phân nhánh và gắn thẻ để tạo ra một quy trình cho phép chúng tôi thực hiện các tính năng mới trong các dự án mới mà không cần quá nhiều chi phí?