Mô hình phân nhánh từ Vincent Driessen’s A successful Git branching model – một mô hình kinh điển – được áp dụng bởi hầu hết các công ty công nghệ hàng đầu hiện nay. Bài viết này sẽ chia sẻ những kiến thức chung nhất về Git Flow cũng như áp dụng GitFlow trong các dự án.
How it works
Gitflow là một tập các thao tác mở rộng của git nhằm cung cấp các thao tác với repository ở mức cao dựa trên mô hình phân nhánh của Vincent Driessen’s. Trên OSX chạy command brew install git-flow để cài đặt. Trên Windows các bạn download và cài đặt git-flow ở link này.
Develop and Master Branches
Nếu một mình bạn “thầu nguyên con” dự án, lượng requirement sấp mặt nhưng vẫn cảm thấy cuộc đời thật êm xuôi cho tới lúc sếp xót thương bạn vất vả, tuyển thêm cho 2 bé Fresher trợ giúp. Mọi chuyện bắt đầu từ đây: branch master của bạn bị conflict, chồng chéo commit liên tục. Branch master đang thẳng tắp bỗng phân nhánh kinh hoàng, tốc độ code của bạn giảm tỉ lệ nghịch với tốc độ chửi thề… Cảm thấy bế tắc
Sơ đồ phân nhánh master branch. nguồn: Xebia.com
Solution:
Thay vì sử dụng master branch, chúng ta sử dụng 2 branch chính – master và develop branch. Master branch sử dụng để lưu trữ version code ổn định, sẵn sàng triển khai. Develop branch ban đầu được tách từ master, sẽ chứa phần code mới nhất được phát triển.
#Nhắc bài: Để tạo branch mới trong Git sử dụng command:
git checkout -b <new branch name> [base branch] |
Với Git-flow extension lib, sử dụng command git flow init repo hiện tại để tạo develop branch:
$ git flow init |
Feature Branches
Feature branches là các branch được rẽ nhánh để triển khai các tính năng riêng biệt. Thường sẽ có tiền tố feature/. VD: feature/development_v3.1_login_page.
Thay vì được rẽ nhánh từ master, các feature branch sử dụng develop branch là nhánh cha. Khi các phát triển xong tính năng mới, feature branch sẽ được merge vào develop. Không nên merge trực tiếp vào master branch. Hình minh họa bên dưới:
Feature branchs. Nguồn atlassian.com
Tạo feature branch:
Git command:
git checkout develop |
Với Git-flow extension lib:
git flow feature start feature_branch |
Release Branches
Khi hoàn thành tính năng trên feature branch, bước tiếp theo là merge feature vào develop branch.
Git command:
git checkout develop |
Với Git-flow extension lib:
git flow feature finish feature_branch |
Merge code thông thường có 2 trường hợp xảy ra với develop branch:
Trường hợp 1: Không có commit mới:
Develop branch không có commits mới trông sẽ thế này. Nguồn ehkoo.com
Theo hình minh họa, nhánh login (màu vàng) được rẽ nhánh từ nhánh dev (màu xanh) và trong nhánh dev không có commit nào mới. Trường hợp này khi merge code sẽ không gặp conflict.
Trường hợp 2: Có những commit mới:
Develop branch có 2 commits mới. Nguồn ehkoo.com
Trong trường hợp này branch dev đang có 2 commit phía trước branch login (màu vàng). Khi merge code khả năng cao sẽ gặp conflict nếu 2 commit mới trên dev cũng sửa cùng đoạn code bạn sửa ở login branch. May mắn hơn nếu không gặp conflict thì merge vào nhìn history cũng loằng ngoằng hơn như hình dưới đây:
History sau khi merge code sẽ trông thế này. Nguồn ehkoo.com
Do vậy chúng ta nên chỉnh sửa lại hisotry của branch login bằng cách dùng command git rebase. git rebase sẽ lấy những commit ở branch login đặt vào sau những commit mới nhất ở branch dev. Cú pháp:
git rebase <rebase branch name> |
Nếu xảy ra conflict, sau khi xử lý các conflict bạn chạy command git rebase --continue để tiếp tục tiến trình rebase. Bạn cũng có thể chạy git rebase --abort để hủy bỏ rebase và đưa nhánh login về lại trạng thái cũ. Sau khi rebase xong history của bạn trông sẽ kiểu này:
Login branch sau khi đã rebase. Nguồn ehkoo.com
Ngoài ra còn có rebase interactively. Với rebase interactively chúng ta có thêm nhiều quyền để quản lý và sửa đổi commit theo ý mình, làm cho history dễ nhìn hơn.
Hoặc bạn có thể merge trực tiếp vào dev như sau:
# Chuyển branch sang dev |
Kết quả khi merge login từ dev. Nguồn ehkoo.com
Cách thức này gọi là merge fast-forward. Tất cả commits của login đã được kết hợp vào dev. Login branch biến mất như chưa hề tồn tại 😀
Maintenance Branches (Hotfix Branches)
Khác với feature branch. Các hotfix branch được rẽ nhánh từ master. Các nhánh hotfix thường có tiền tố là: hotfix/. Chúng chứa những source code liên quan đến việc phải fix gấp những lỗi ở phiên bản đã được triển khai (đã deploy lên môi trường production). Để tạo branch hotfix:
Git command:
git checkout master git checkout -b hotfix_branch |
Với Git-flow extension lib:
git flow hotfix start hotfix_branch |
Các hotfix branch cần merge vào master branch và develop. VD:
Git command:
git checkout master |
Với Git-flow extension lib:
git flow hotfix finish hotfix_branch |
Tổng kết lại
Chúng ta có thể tóm tắt bài này lại như sau:
- Source được chia thành nhiều branch gồm master, develop, có thể có thêm staging.
- Các tính năng được rẽ nhánh từ develop, phát triển độc lập trên các branch khác nhau và nên được rebase trước khi merge vào develop. Merge có thể là fast-forward hoặc non-fast-forward
- develop merge vào master mỗi khi triển khai. Trường hợp có staging, develop sẽ được merge vào staging, và staging sẽ được merge vào master.
- Các nhánh hotfix sẽ được chia ra từ master, sau đó merge --no-ff vào master và develop
Bài viết này chỉ mang tính tham khảo vì mỗi team mỗi công ty có những cách làm riêng. Tuy nhiên đây là workflow đã áp dụng thành công ở rất nhiều công ty, dự án. Hi vọng giúp ích được cho các bạn nhất là các bạn sinh viên chuẩn bị đi làm.