Nấu một bữa ăn gồm nhiều giai đoạn: lập kế hoạch, chuẩn bị, nấu và bày biện. Nấu nhiều món cùng lúc có thể cần nhiều người. Chia việc thành bước nhỏ và giao nhiệm vụ. Bữa ăn xong đúng giờ.
Git Flow theo nguyên tắc tương tự. Nó chia nhiệm vụ phức tạp thành giai đoạn nhỏ và giao trách nhiệm. Quy trình phát triển phần mềm gọn gàng, sản phẩm chất lượng cao.
Git Flow là gì?
Nhà phát triển dùng Git, hệ thống kiểm soát phiên bản, để quản lý cơ sở mã. Thông tin về Git: https://vulehuan.com/vi/r/EBmbkYQdj_j
Vincent Driessen tạo Git Flow năm 2010 dưới dạng mô hình phân nhánh cho Git. Driessen viết bài blog (https://nvie.com/posts/a-successful-git-branching-model/) giải thích chiến lược phân nhánh, "Mô hình phân nhánh Git thành công". Chiến lược này phổ biến. Nhiều nhóm áp dụng Git Flow; đây là phương pháp được dùng rộng rãi.
Git Flow là mô hình phân nhánh trong Git. Nó giúp nhóm quản lý và điều phối quy trình bằng cách chia thành giai đoạn riêng biệt, mỗi giai đoạn có nhánh riêng. Thành viên làm việc đồng thời trên tính năng và thay đổi khác nhau mà không gián đoạn nhau.
Git Flow có hai nhánh chính: "master" cho mã ổn định, sẵn sàng production, và "develop" cho phát triển liên tục. Nhánh feature, release và hotfix được tạo khi cần. Cách này giữ quy trình có tổ chức, tránh xung đột, đảm bảo chất lượng và độ ổn định cao.
Git Flow mang lại quy trình có cấu trúc. Nó giúp quản lý cơ sở mã, tránh xung đột, duy trì chất lượng và độ ổn định. Blog này nói về lợi ích, xử lý lỗi và nhiều nhà phát triển cùng dự án.
Làm thế nào Git Flow có thể được sử dụng cho một nhánh tính năng (feature)?
- Tạo nhánh tính năng: Tạo khi phát triển tính năng mới. Chạy git flow feature start feature-name. Lệnh tạo "feature/feature-name" từ "develop".
- Phát triển tính năng: Làm việc mà không ảnh hưởng "develop". Add và commit thay đổi vào nhánh tính năng.
- Hợp nhất nhánh tính năng: Khi xong, chạy git flow feature finish feature-name. Lệnh hợp nhất thay đổi vào "develop", xóa nhánh tính năng và đưa bạn về "develop".
- Đánh giá thay đổi: Xem xét và kiểm tra kỹ trước khi hợp nhất "develop" vào "master" để phát hành. Nhờ vậy tính năng ổn định.
Git Flow quản lý phát triển tính năng có tổ chức. Nhiều nhà phát triển làm việc trên tính năng khác nhau mà không ảnh hưởng nhau.
Chạy "git pull" trên "develop" trước khi kết thúc nhánh tính năng để lấy thay đổi mới nhất. Sau git flow feature finish feature-name, bạn về "develop". Chạy "git push" để người khác truy cập thay đổi.
Ví dụ: thêm chức năng đăng nhập bằng Git Flow:
- Chạy git checkout develop && git pull && git flow feature start login để tạo "feature/login" từ "develop".
- Làm việc trên "feature/login" mà không ảnh hưởng "develop". Thêm biểu mẫu đăng nhập và logic, rồi commit.
- Xem xét và kiểm tra tính năng. Tạo "Pull Request" để hợp nhất "feature/login" vào "develop" để xem xét mã và kiểm tra.
- Sau khi xem xét, chạy git checkout develop && git pull && git flow feature finish login && git push origin develop. Lệnh hợp nhất thay đổi vào "develop", xóa "feature/login" và đưa bạn về "develop".
- Khi mọi tính năng đã hợp nhất vào "develop", hợp nhất nó vào "master" để phát hành và triển khai. Tìm hiểu thêm về nhánh phát hành trong bài này.
Nhóm cũng dùng Git Flow cho nhánh phát hành, tạo khi chuẩn bị phiên bản mới lên production. Ví dụ:
Làm thế nào Git Flow có thể được sử dụng cho một nhánh phát hành (release)?
Chạy git flow release start release-name để tạo "release/release-name" từ "develop".
Nhà phát triển chuẩn bị phát hành mà không ảnh hưởng "develop". Họ sửa lỗi cuối cùng và commit thay đổi vào nhánh phát hành.
Kiểm tra kỹ bản phát hành. Tạo "pull request" để hợp nhất "release/release-name" vào "master" để thử nghiệm.
Sau khi xem xét và kiểm tra, chạy git flow release finish release-name. Lệnh hợp nhất thay đổi vào cả "develop" và "master", xóa nhánh phát hành và đưa bạn về "develop".
Quy trình này giữ phát hành có tổ chức, đảm bảo chất lượng và độ ổn định cao, tránh xung đột.
Để hoàn thành phát hành, pull thay đổi từ "develop" và "master" trước git flow release finish release-name. Sau đó push lên cả hai nhánh bằng git push. Tag được tạo tự động cho bản phát hành. Push tag để người khác biết mã nào chạy trên production. Liệt kê tag bằng "git tag"; chuyển tag bằng git checkout tag-name. Push tag bằng git push --tags hoặc git push origin tag-name.
Ví dụ: phát hành phiên bản 1.0:
- Tạo nhánh phát hành: chạy git checkout develop && git pull && git flow release start 1.0. Lệnh tạo "release/1.0" từ "develop".
- Chuẩn bị phát hành: sửa lỗi cuối cùng và commit. Cập nhật số phiên bản, sửa lỗi nghiêm trọng và đảm bảo mọi bài kiểm tra vượt qua.
- Kiểm tra bản phát hành: tạo "pull request" để hợp nhất "release/1.0" vào "master" để thử nghiệm. Nhóm kiểm tra xem xét mọi tính năng và lỗi lớn.
- Hoàn thiện bản phát hành: chạy git checkout develop && git pull && git checkout master && git pull && git flow release finish 1.0. Lệnh hợp nhất thay đổi vào cả "develop" và "master", xóa "release/1.0" và đưa bạn về "develop".
- Push hai nhánh và tag "1.0": git push origin develop && git push origin master && git push origin 1.0
Các quy tắc và quy ước đặt tên phát hành phổ biến
- Phiên bản theo ngữ nghĩa: số phiên bản ba phần (ví dụ: 1.2.3) cho bản chính, phụ và bản vá. Thêm: https://semver.org/
- Phiên bản lịch: ngày phát hành làm số phiên bản (ví dụ: 2022.03.01). Thêm: https://calver.org/
- Tên động vật: dùng tên động vật cho bản phát hành, như Ubuntu và Google Android. Thêm về Ubuntu: https://wiki.ubuntu.com/DevelopmentCodeNames.
- Bản phát hành được đặt tên: tên độc đáo, dễ nhớ, như tên mèo lớn của Apple cho OS X (Sư tử núi, Sư tử, Báo hoa mai, v.v.).
- Đánh số thứ tự: đánh số tuần tự, như số phiên bản Windows của Microsoft (Windows 10, Windows 11).
Làm thế nào Git Flow có thể được sử dụng cho một nhánh hotfix?
Lỗi nghiêm trọng cần sửa ngay. Hotfix xử lý mà không gián đoạn phát triển thường. Ví dụ: lỗ hổng bảo mật trong ứng dụng web có thể sửa bằng nhánh hotfix từ "master", rồi hợp nhất vào cả "master" và "develop". Lỗi nghiêm trọng trong ứng dụng di động có thể sửa và triển khai lên production mà không đợi chu kỳ phát hành thường.
Git Flow dùng nhánh hotfix cho sự cố production khẩn cấp. Chạy git flow hotfix start hotfix-name để tạo "hotfix/hotfix-name" từ "master". Nhà phát triển sửa lỗi và commit. Kiểm tra kỹ bằng "pull request" để hợp nhất hotfix vào "master" để thử nghiệm. Sau khi xem xét, chạy git flow hotfix finish hotfix-name. Lệnh hợp nhất thay đổi vào cả "master" và "develop", xóa nhánh hotfix và về "develop". Quy trình này xử lý sự cố khẩn cấp nhanh, giữ chất lượng và độ ổn định, tránh xung đột.
Để hoàn thành hotfix, pull thay đổi từ "develop" và "master" trước git flow hotfix finish hotfix-name. Sau đó push lên cả hai nhánh bằng git push. Tag được tạo tự động cho hotfix. Push tag để người khác biết mã nào chạy trên production. Liệt kê tag bằng "git tag"; chuyển tag bằng git checkout tag-name. Push tag bằng git push --tags hoặc git push origin tag-name.
Đặt phiên bản hotfix bằng cách thêm hậu tố vào phiên bản phát hành trước. Nếu bản trước là 1.0, hotfix có thể là 1.0.1, rồi 1.0.2. Lược đồ khác nhau theo dự án và nhóm. Giữ số phiên bản rõ ràng, nhất quán để theo dõi. Sau khi hợp nhất vào "master", cập nhật số phiên bản mới trong các tệp thích hợp và commit vào "master" để bản phát hành sau phản ánh.
Ví dụ: sự cố nghiêm trọng trên production với tag 1.2.0:
- Tạo nhánh hotfix: chạy git checkout master && git pull && git flow hotfix start 1.2.1. Lệnh tạo "hotfix/1.2.1" từ "master".
- Tạo hotfix: sửa sự cố trong "hotfix/1.2.1" và commit. Ví dụ: git commit -m "Fix critical bug XYZ"
- Kiểm tra hotfix: tạo "pull request" để hợp nhất "hotfix/1.2.1" vào "master" để thử nghiệm. Đảm bảo sửa được sự cố mà không gây sự cố mới.
- Hoàn thiện hotfix: chạy git checkout develop && git pull && git checkout master && git pull && git flow finish hotfix 1.2.1. Lệnh hợp nhất thay đổi vào cả "master" và "develop", xóa "hotfix/1.2.1" và đưa bạn về "develop".
- Push hai nhánh và tag "1.2.1": git push origin develop && git push origin master && git push origin 1.2.1
Các nhánh Sửa lỗi (bugfix) và Hỗ trợ (support)
Git Flow dùng nhánh sửa lỗi để giải quyết một vấn đề cụ thể trong cơ sở mã. Nhánh tạo từ nhánh phát hành và hợp nhất lại vào cả nhánh phát hành (release/release-name) và nhánh phát triển (develop) sau khi kiểm tra và xác thực.
Quy trình sửa lỗi:
- Xác định vấn đề: xem báo cáo lỗi, phản hồi người dùng hoặc kiểm tra để tìm lỗi cụ thể.
- Tạo nhánh sửa lỗi: tạo từ nhánh phát hành mới nhất (release/release-name) với tên phản ánh vấn đề.
- Thực hiện thay đổi cần thiết: cập nhật dòng mã, tệp cấu hình hoặc phần khác của cơ sở mã.
- Kiểm tra và xác minh bản sửa: chạy kiểm tra tự động, thủ công hoặc cả hai.
- Hợp nhất bản sửa vào nhánh phát hành: hợp nhất vào nhánh phát hành (release/release-name) để bản phát hành sau có bản sửa.
- Hợp nhất bản sửa vào nhánh phát triển: hợp nhất vào nhánh phát triển để mọi bản phát hành tương lai có bản sửa.
Các nhánh hỗ trợ tạo từ "master" để cung cấp hỗ trợ lâu dài cho một phiên bản cụ thể. Chúng cung cấp bản sửa lỗi và cập nhật bảo mật cho phiên bản đó mà không ảnh hưởng phiên bản mới hơn. Tên gồm số phiên bản, như "support/1.0.x". Chúng tồn tại lâu và cần tài liệu, quy trình rõ ràng, đặc biệt cho ứng dụng quan trọng như phần mềm y tế hoặc tài chính.
Cài đặt Git Flow
Trên Ubuntu, kiểm tra Git bằng sudo apt-get update && sudo apt-get install git. Thêm về Git: https://vulehuan.com/vi/r/EBmbkYQdj_j. Sau đó cài Git Flow bằng sudo apt-get install git-flow. Tùy chọn cài đặt khác: https://github.com/nvie/gitflow/wiki/Installation.
Khởi tạo Git Flow trong kho lưu trữ. Vào thư mục dự án và chạy git flow init. Chọn tùy chọn cấu hình như tên nhánh phát triển và production. Thêm "-d" vào git flow init để dùng mặc định và bỏ qua lời nhắc.
Sau đó dùng Git Flow trong quy trình. Tạo nhánh tính năng bằng git flow feature start [name]; kết thúc bằng git flow feature finish [name]; xuất bản bằng git flow feature publish [name]. Theo dõi nhánh tính năng từ xa bằng git flow feature track [name]; pull thay đổi bằng git flow feature pull [remote] [name].
Lệnh tương tự cho nhánh release, hotfix và support. Ví dụ: git flow release start [version], git flow release finish [version] và git flow release publish [version]. Dùng lệnh "track" hoặc "pull" phù hợp cho nhánh từ xa.
git flow version hiển thị phiên bản Git Flow; git flow config hiển thị tùy chọn cấu hình; git flow help hiển thị trợ giúp.
Lưu ý: git flow XYZ publish [name] và git push XYZ/[name] đều push nhánh XYZ lên kho từ xa nhưng khác nhau. git flow XYZ publish [name] xuất bản nhánh feature/release/hotfix/support lên kho từ xa. git push XYZ/[name] push thay đổi cục bộ trên nhánh đó lên nhánh từ xa.
Các quy trình Git Workflows được sử dụng rộng rãi khác
- GitLab Flow: tối ưu cho cộng tác và tích hợp liên tục (CI), dùng bởi GitLab. Nhấn mạnh nhánh tính năng và yêu cầu hợp nhất, phù hợp mọi quy mô nhóm. Thêm: https://docs.gitlab.com/ee/topics/gitlab_flow.html
- GitHub Flow: quy trình nhẹ dựa trên nhánh, hỗ trợ phân phối và triển khai liên tục, dùng bởi GitHub. Nhấn mạnh nhánh tính năng và Pull Request, phù hợp nhóm nhỏ, nhanh. Thêm: https://guides.github.com/introduction/flow/
- OneFlow: mô hình phân nhánh và quy trình đơn giản hóa Git bằng một nhánh, dùng bởi Spotify và Walmart Labs. Nhấn mạnh phân phối và triển khai liên tục, phù hợp mọi quy mô nhóm. Thêm: https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow
- Trunk-Based Development (TBD): nhấn mạnh nhánh tính năng ngắn hạn và tích hợp liên tục, dùng bởi Google và Amazon. Phù hợp nhóm lớn, phân tán; giảm xung đột hợp nhất và nguy cơ hồi quy. Thêm: https://trunkbaseddevelopment.com/
- Forking Workflow: phổ biến trong dự án nguồn mở khi người đóng góp không có quyền ghi. Người đóng góp fork kho chính, thay đổi trong fork, rồi gửi Pull Request. Cách này cho phép cộng tác và đánh giá nhưng vẫn kiểm soát chặt kho chính.
Phần kết luận
Git Flow cung cấp chiến lược phân nhánh có cấu trúc, hợp lý hóa phát triển phần mềm. Nhóm quản lý nhiều phiên bản cơ sở mã mà vẫn giữ chất lượng và độ ổn định cao. Nhánh hotfix xử lý sự cố production nghiêm trọng nhanh mà không gián đoạn phát triển thường. Tuân thủ quy trình hotfix đúng, gồm đặt phiên bản và cập nhật bản phát hành sau. Git Flow đảm bảo phát triển hiệu quả, ít lỗi và xung đột, phần mềm chất lượng cao cho người dùng cuối.
