Chuyển tới nội dung

Git Workflow

Có 2 loại workflow là Gitflow và Trunk-Based Development)

1. GitFlow

Gitflow là một mô hình phân nhánh nghiêm ngặt, được giới thiệu bởi Vincent Driessen, tập trung vào việc quản lý các bản phát hành theo lịch trình. Nó sử dụng nhiều nhánh có vòng đời dài để tách biệt các giai đoạn phát triển, kiểm thử và phát hành.
Các nhánh chính:
- main (hoặc master): Chứa mã nguồn luôn sẵn sàng cho môi trường production. Chỉ các bản phát hành ổn định mới được merge vào nhánh này.
- develop: Nhánh chính cho quá trình phát triển. Các tính năng mới được merge vào đây trước khi được đưa lên main.
- feature/*: Các nhánh tạm thời, được tạo từ develop để phát triển một tính năng cụ thể.
- release/*: Được tạo từ develop để chuẩn bị cho một bản phát hành mới. Nhánh này được dùng để fix bug, cập nhật tài liệu và chuẩn bị release. Sau khi hoàn thành, nó sẽ được merge vào cả main và develop.
- hotfix/*: Được tạo từ main để sửa lỗi khẩn cấp trên môi trường production. Sau khi sửa xong, nó sẽ được merge vào cả main và develop.
Ưu điểm:
– Cấu trúc rõ ràng: Phù hợp cho các dự án có chu kỳ phát hành theo lịch trình.
– Phân tách môi trường: Tách biệt rõ ràng code đang phát triển và code đang chạy trên production.
– Kiểm soát chất lượng: Cho phép kiểm thử sâu hơn trên nhánh release trước khi đưa lên production.
Nhược điểm:
– Phức tạp: Có quá nhiều nhánh, dẫn đến việc quản lý phức tạp và dễ gây nhầm lẫn.
– Chậm trễ: Các nhánh feature có vòng đời dài, dễ dẫn đến xung đột code (merge conflict) khi merge và làm chậm quá trình tích hợp.
– Ít phù hợp với CI/CD: Mô hình này không khuyến khích việc tích hợp liên tục và triển khai nhanh chóng.

2. Trunk-Based Development

Trunk-based Development (TBD) hay còn gọi là Phát triển dựa trên nhánh chính là một mô hình quản lý mã nguồn (version control management) mà theo đó các nhà phát triển cam kết (commit) các thay đổi nhỏ, thường xuyên và trực tiếp vào một nhánh chính duy nhất, gọi là trunk (hoặc main/master).
Mục tiêu chính của TBD là duy trì nhánh chính luôn ở trạng thái ổn định và có thể triển khai (deployable), giúp đẩy nhanh quá trình Continuous Integration (CI) và Continuous Delivery (CD).

Quy trình:
– Tất cả developer đều commit trực tiếp vào nhánh main hoặc sử dụng các nhánh tính năng có vòng đời rất ngắn (chỉ vài giờ).
– Các thay đổi nhỏ và thường xuyên được merge vào nhánh chính.
– Để tránh làm hỏng code trên main, các tính năng chưa hoàn thành thường được che bằng Feature Flags (cờ tính năng), cho phép bật/tắt tính năng mà không cần phải triển khai lại code.

Ưu điểm:
– Tích hợp liên tục: Giảm thiểu xung đột code do các thay đổi nhỏ được merge thường xuyên.
– Tốc độ nhanh: Phù hợp với các quy trình CI/CD (Tích hợp liên tục và Triển khai liên tục) và các team cần phát hành sản phẩm nhanh.
– Đơn giản: Dễ quản lý hơn nhiều so với Gitflow, đặc biệt với các team nhỏ và trung bình.
Nhược điểm:
– Đòi hỏi cao: Yêu cầu team phải có kỷ luật tốt, code review nghiêm ngặt và hệ thống kiểm thử tự động mạnh mẽ.
– Rủi ro: Nếu không có hệ thống kiểm thử tốt, một commit lỗi có thể làm hỏng nhánh main và ảnh hưởng đến toàn bộ quá trình phát triển.
– Khó kiểm soát bản phát hành: Việc triển khai có thể diễn ra liên tục, làm khó khăn cho các dự án có lịch trình phát hành cố định.

So sánh giữa GitFlow và Trunked Base

Tiêu chíGitflowTrunk-based Development (TBD)
Số lượng nhánh chínhHai nhánh chính (master/main cho Production và develop cho Phát triển)Một nhánh chính duy nhất (Trunk/Main)
Thời gian sống của nhánh tính năng (Feature Branches)Dài (cho đến khi tính năng hoàn thành, có thể kéo dài nhiều tuần/tháng)Rất ngắn (chỉ vài giờ đến tối đa 1-2 ngày)
Tần suất tích hợp (Integration Frequency)Không thường xuyên (tích hợp vào develop sau khi tính năng hoàn thành)Liên tục (nhiều lần mỗi ngày)
Mục tiêu chínhQuản lý Release có cấu trúc và hỗ trợ nhiều phiên bảnTốc độ và Continuous Delivery (CD)
Tính ổn định của nhánh chínhMaster/Main luôn ổn định. Develop ổn định hơn các nhánh feature, nhưng không chắc chắn là luôn sẵn sàng triển khai.Luôn ổn định, sẵn sàng triển khai (Deployable)
Kỹ thuật cô lập codeSử dụng phân nhánh (branching) để cô lập code đang làm dở.Sử dụng Feature Flags/Toggles để ẩn code chưa hoàn thiện.
Tag:
Liên hệ