Bạn nên làm cả hai .
Bắt đầu với câu trả lời được chấp nhận từ @Norman: Sử dụng một kho lưu trữ với một nhánh có tên trên mỗi bản phát hành.
Sau đó, có một bản sao trên mỗi nhánh phát hành để xây dựng và thử nghiệm.
Một lưu ý chính là ngay cả khi bạn sử dụng nhiều kho lưu trữ, bạn nên tránh sử dụng transplant
để di chuyển các thay đổi giữa chúng vì 1) nó thay đổi hàm băm và 2) nó có thể gây ra các lỗi rất khó phát hiện khi có những thay đổi xung đột giữa các thay đổi của bạn ghép và nhánh đích. Thay vào đó, bạn muốn thực hiện hợp nhất thông thường (và không có phần mở đầu: luôn luôn kiểm tra trực quan việc hợp nhất), điều này sẽ dẫn đến kết quả @mg nói ở cuối câu trả lời của anh ấy:
Biểu đồ có thể trông khác nhau, nhưng nó có cùng cấu trúc và kết quả cuối cùng là như nhau.
Cụ thể hơn, nếu bạn sử dụng nhiều kho lưu trữ, kho lưu trữ "thân cây" (hoặc mặc định, chính, phát triển, bất cứ thứ gì) chứa TẤT CẢ các thay đổi trong TẤT CẢ các kho lưu trữ. Mỗi kho lưu trữ phát hành / chi nhánh chỉ đơn giản là một nhánh trong trung kế, tất cả được hợp nhất trở lại theo cách này hoặc cách khác trở lại trung kế, cho đến khi bạn muốn để lại một bản phát hành cũ phía sau. Do đó, sự khác biệt thực sự duy nhất giữa repo chính đó và repo đơn trong sơ đồ nhánh được đặt tên chỉ đơn giản là liệu các nhánh có được đặt tên hay không.
Điều đó sẽ làm cho rõ ràng lý do tại sao tôi nói "bắt đầu với một repo". Repo duy nhất đó là nơi duy nhất bạn cần tìm kiếm bất kỳ thay đổi nào trong bất kỳ bản phát hành nào . Bạn có thể thêm thẻ thay đổi trên các nhánh phát hành để tạo phiên bản. Khái niệm này rõ ràng và đơn giản, và làm cho quản trị viên hệ thống đơn giản hơn, vì đó là điều duy nhất hoàn toàn phải có sẵn và có thể phục hồi mọi lúc.
Nhưng sau đó bạn vẫn cần duy trì một bản sao trên mỗi nhánh / bản phát hành mà bạn cần xây dựng và kiểm tra. Đó là chuyện nhỏ như bạn có thể hg clone <main repo>#<branch> <branch repo>
, và sau đó hg pull
trong repo chi nhánh sẽ chỉ kéo các thay đổi mới trên nhánh đó (cộng với thay đổi tổ tiên trên các nhánh trước đó đã được hợp nhất).
Thiết lập này phù hợp nhất với mô hình cam kết hạt nhân linux của trình kéo đơn (không cảm thấy tốt khi hoạt động như Lord Linus. Tại công ty chúng tôi gọi là bộ tích hợp vai trò ), vì repo chính là thứ duy nhất mà các nhà phát triển cần sao chép và puller cần phải kéo vào. Bảo trì các repos chi nhánh hoàn toàn để quản lý phát hành và có thể hoàn toàn tự động. Các nhà phát triển không bao giờ cần phải kéo từ / đẩy đến các repos chi nhánh.
Dưới đây là ví dụ của @ mg được lấy lại cho thiết lập này. Điểm khởi đầu:
[a] - [b]
Tạo một nhánh được đặt tên cho phiên bản phát hành, nói "1.0", khi bạn nhận được bản phát hành alpha. Cam kết sửa lỗi trên nó:
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
(1.0)
không phải là một thay đổi thực sự vì nhánh được đặt tên không tồn tại cho đến khi bạn cam kết. (Bạn có thể thực hiện một cam kết tầm thường, chẳng hạn như thêm thẻ, để đảm bảo các nhánh có tên được tạo đúng.)
Hợp nhất [m1]
là chìa khóa để thiết lập này. Không giống như kho lưu trữ dành cho nhà phát triển nơi có số lượng người đứng đầu không giới hạn, bạn KHÔNG muốn có nhiều đầu trong kho chính của mình (ngoại trừ nhánh phát hành cũ, đã chết như đã đề cập trước đó). Vì vậy, bất cứ khi nào bạn có các thay đổi mới trên các nhánh phát hành, bạn phải hợp nhất chúng trở lại nhánh mặc định (hoặc nhánh phát hành sau) ngay lập tức. Điều này đảm bảo rằng mọi sửa lỗi trong một bản phát hành cũng được bao gồm trong tất cả các bản phát hành sau.
Trong khi đó, sự phát triển trên nhánh mặc định tiếp tục hướng tới phiên bản tiếp theo:
------- [c] - [d]
/
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
Và như thường lệ, bạn cần hợp nhất hai đầu trên nhánh mặc định:
------- [c] - [d] -------
/ \
[a] - [b] ------------------ [m1] - [m2]
\ /
(1.0) - [x] - [y]
Và đây là bản sao nhánh 1.0:
[a] - [b] - (1.0) - [x] - [y]
Bây giờ là một bài tập để thêm nhánh phát hành tiếp theo. Nếu là 2.0 thì nó chắc chắn sẽ phân nhánh mặc định. Nếu là 1.1, bạn có thể chọn rẽ nhánh 1.0 hoặc mặc định. Bất kể, bất kỳ thay đổi mới nào trên 1.0 trước tiên nên được hợp nhất với nhánh tiếp theo, sau đó để mặc định. Điều này có thể được thực hiện tự động nếu không có xung đột, dẫn đến chỉ là một sự hợp nhất trống rỗng.
Tôi hy vọng ví dụ làm cho các điểm trước đây của tôi rõ ràng. Tóm lại, ưu điểm của phương pháp này là:
- Kho lưu trữ có thẩm quyền duy nhất có chứa thay đổi hoàn toàn và lịch sử phiên bản.
- Quản lý phát hành rõ ràng và đơn giản hóa.
- Quy trình làm việc rõ ràng và đơn giản hóa cho các nhà phát triển và tích hợp.
- Tạo điều kiện lặp lại quy trình công việc (đánh giá mã) và tự động hóa (tự động kết hợp trống).
CẬP NHẬT hg chính nó làm điều này : repo chính chứa các nhánh mặc định và ổn định, và repo ổn định là bản sao nhánh ổn định. Tuy nhiên, nó không sử dụng nhánh được phiên bản, vì các thẻ phiên bản dọc theo nhánh ổn định đủ tốt cho mục đích quản lý phát hành của nó.