Trong bài viết này, hãy cùng VietnamWorks inTECH khám phá những kiến thức cơ bản về Git Flow mà một lập trình viên cần nắm vững. Từ cách cấu trúc các nhánh đến quy trình làm việc cụ thể, bạn sẽ hiểu rõ hơn về cách Git Flow nâng cao hiệu quả công việc của bạn và đội ngũ phát triển.

1. Git flow là gì?

Gitflow là một mô hình phân nhánh Git thay thế, bao gồm việc sử dụng các nhánh tính năng và nhiều nhánh chính. Nó được công bố lần đầu tiên tại nvie và trở nên phổ biến nhờ Vincent Driessen. So với phát triển dựa trên nhánh chính (trunk-based development), Gitflow có nhiều nhánh dài hạn hơn và các commit lớn hơn. Trong mô hình này, các nhà phát triển tạo một nhánh tính năng và chỉ merge nó vào nhánh chính khi tính năng đã hoàn thành. 

Gitflow phù hợp với các dự án có lịch release định kỳ và cho việc release liên tục trong DevOps. Mô hình này không thêm khái niệm hay lệnh mới nào ngoài những gì đã có trong Feature Branch Workflow. Thay vào đó, nó chỉ định các vai trò cụ thể cho các nhánh khác nhau và xác định cách và thời điểm chúng nên tương tác. Ngoài các nhánh tính năng, Gitflow còn sử dụng các nhánh riêng để chuẩn bị, duy trì và ghi lại các bản release. Bạn cũng sẽ được hưởng tất cả các lợi ích của Feature Branch Workflow, như pull requests, thử nghiệm riêng biệt và hợp tác hiệu quả hơn.

2. Git flow hoạt động như thế nào?

Git workflow

Thay vì chỉ sử dụng một nhánh chính, quy trình này sử dụng hai nhánh để ghi lại lịch sử dự án. Nhánh chính (main) lưu trữ lịch sử release chính thức, trong khi nhánh phát triển (develop) được dùng để tích hợp các tính năng. Nó cũng thuận tiện để gán số phiên bản cho tất cả các commit trên nhánh chính.

Bước đầu tiên là bổ sung nhánh develop vào nhánh chính mặc định. Một cách đơn giản để làm điều này là tạo một nhánh develop trống trên máy cục bộ và đẩy nó lên máy chủ:

git branch develop
git push -u origin develop

Nhánh này sẽ chứa toàn bộ lịch sử của dự án, trong khi nhánh chính chỉ chứa một phiên bản rút gọn. Các lập trình viên khác bây giờ nên sao chép kho lưu trữ trung tâm và tạo một nhánh theo dõi cho nhánh develop.

Khi sử dụng thư viện mở rộng git-flow, việc thực hiện lệnh git flow init trên một kho lưu trữ hiện có sẽ tạo ra nhánh develop:

$ git flow init


Initialized empty Git repository in ~/project/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [main]
Branch name for "next release" development: [develop]


How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []


$ git branch
* develop
 main

 

3. Các nhánh tính năng (Feature branches)

Bước 1. Tạo kho lưu trữ

Mỗi tính năng mới nên nằm trong một nhánh riêng, và nhánh này có thể được đẩy lên kho lưu trữ trung tâm để backup/collaboration. Tuy nhiên, thay vì phân nhánh từ nhánh chính, các nhánh tính năng sử dụng nhánh develop làm nhánh cha của chúng. Khi một tính năng hoàn tất, nó sẽ được merge lại vào nhánh develop. Các tính năng không bao giờ tương tác trực tiếp với nhánh chính.

Git workflow - feature branches

Lưu ý rằng việc kết hợp các nhánh tính năng với nhánh develop về cơ bản là Quy trình Feature Branch Workflow. Tuy nhiên, quy trình Gitflow không dừng lại ở đó.

Các nhánh tính năng thường được tạo ra từ nhánh develop mới nhất.

Bước 2: Tạo một nhánh tính năng

Khi không có phần mở rộng git-flow:

git checkout develop
git checkout -b feature_branch

 

Khi sử dụng tiện ích mở rộng git-flow:

git flow feature start feature_branch

Tiếp tục công việc và sử dụng Git như bình thường.

Bước 3: Hoàn thiện một nhánh tính năng

Khi bạn hoàn tất công việc phát triển tính năng, bước tiếp theo là merge feature_branch vào develop.

Khi không có phần mở rộng git-flow:

git checkout develop
git merge feature_branch

Khi sử dụng tiện ích mở rộng git-flow:

git flow feature finish feature_branch

 

4. Release các nhánh

Git workflow - release branches

Khi nhánh develop đã tích lũy đủ tính năng cho một bản release (hoặc ngày release đã được xác định đang đến gần), bạn tạo một nhánh release từ nhánh develop. Việc tạo nhánh này đánh dấu việc bắt đầu chu kỳ release tiếp theo, vì vậy không thể thêm tính năng mới sau thời điểm này—chỉ có các sửa lỗi, tạo tài liệu và các nhiệm vụ liên quan đến release khác mới được thực hiện trên nhánh này. Khi nhánh release đã sẵn sàng, nó được merge vào nhánh chính và gán số phiên bản. Ngoài ra, nó cũng nên được merge trở lại vào nhánh develop, vì nhánh develop có thể đã có sự tiến triển kể từ khi release được khởi động.

Việc sử dụng một nhánh riêng để chuẩn bị release cho phép một nhóm làm việc hoàn thiện bản phát hành hiện tại trong khi nhóm khác tiếp tục phát triển các tính năng cho bản phát hành tiếp theo. Nó cũng tạo ra các giai đoạn phát triển rõ ràng.

Việc tạo các nhánh release là một thao tác phân nhánh đơn giản khác. Tương tự như các nhánh tính năng, các nhánh release được dựa trên nhánh develop. Một nhánh release mới có thể được tạo bằng các phương pháp sau.

Khi không có phần mở rộng git-flow:

git checkout develop
git checkout -b release/0.1.0

 

Khi sử dụng tiện ích mở rộng git-flow:

$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'

 

Khi bản phát hành đã sẵn sàng để được triển khai, nó sẽ được merge vào nhánh main và develop, sau đó nhánh release sẽ bị xóa. Việc merge lại vào nhánh develop rất quan trọng vì có thể các cập nhật quan trọng đã được thêm vào nhánh release và cần phải có sẵn cho các tính năng mới. Nếu tổ chức của bạn chú trọng đến việc review code, thì đây sẽ là thời điểm lý tưởng để thực hiện một pull request.

Để hoàn tất một nhánh release, hãy sử dụng các phương pháp sau:

Khi không có phần mở rộng git-flow:

git checkout main
git merge release/0.1.0

 

Khi sử dụng tiện ích mở rộng git-flow:

git flow release finish '0.1.0'

 

5. Các nhánh hotfix

Hotfix branch within git workflow

Các nhánh bảo trì hoặc "hotfix" được sử dụng để nhanh chóng sửa các bản release sản phẩm. Các nhánh hotfix khá giống với các nhánh release và các nhánh tính năng, nhưng chúng dựa trên nhánh chính thay vì nhánh develop. Đây là loại nhánh duy nhất nên phân nhánh trực tiếp từ nhánh chính. Khi sửa lỗi đã hoàn tất, nó nên được merge vào cả nhánh chính và nhánh develop (hoặc nhánh release hiện tại), và nhánh chính nên được gán số phiên bản cập nhật.

Việc có một dòng phát triển riêng biệt của các sửa lỗi cho phép nhóm của bạn xử lý các vấn đề mà không làm gián đoạn quy trình làm việc hoặc phải chờ đợi chu kỳ release tiếp theo. Bạn có thể nghĩ các nhánh bảo trì như là các nhánh release ad hoc làm việc trực tiếp với nhánh chính. Một nhánh hotfix có thể được tạo bằng các phương pháp sau.

Khi không có phần mở rộng git-flow:

git checkout main
git checkout -b hotfix_branch

 

Khi sử dụng tiện ích mở rộng git-flow:

$ git flow hotfix start hotfix_branch

 

Tương tự như việc hoàn thiện một nhánh release, một nhánh hotfix được merge vào cả nhánh chính và nhánh develop.

git checkout main
git merge hotfix_branch
git checkout develop
git merge hotfix_branch
git branch -D hotfix_branch

 

$ git flow hotfix finish hotfix_branch

 

6. Ví dụ

Một ví dụ hoàn chỉnh minh họa Feature Branch Flow như sau. Giả sử chúng ta có một repo được thiết lập với một nhánh chính.

git checkout main
git checkout -b develop
git checkout -b feature_branch
# work happens on feature branch
git checkout develop
git merge feature_branch
git checkout main
git merge develop
git branch -d feature_branch

 

Ngoài luồng feature và release, một ví dụ về hotfix  như sau:

git checkout main
git checkout -b hotfix_branch
# work is done commits are added to the hotfix_branch
git checkout develop
git merge hotfix_branch
git checkout main
git merge hotfix_branch

 

7. Tóm tắt một số điểm chính cần biết về Gitflow

Quy trình Gitflow rất phù hợp cho quy trình phần mềm dựa trên phát hành (Release-Based Software Development). Gitflow cung cấp một kênh riêng biệt để xử lý các sửa lỗi cho sản phẩm.

Flow tổng thể của Gitflow như sau:

1. Tạo nhánh develop từ nhánh chính (main).

2. Tạo nhánh release từ nhánh develop.

3. Tạo các nhánh tính năng từ nhánh develop.

4. Khi một tính năng hoàn tất, nó được merge vào nhánh develop.

5. Khi nhánh release hoàn tất, nó được merge vào cả nhánh develop và nhánh chính.

6. Nếu phát hiện vấn đề trong nhánh chính, tạo một nhánh hotfix từ nhánh chính.

7. Khi hotfix hoàn tất, nó được merge vào cả nhánh develop và nhánh chính.

Lời kết

Git Flow là một phương pháp hữu ích giúp quản lý quy trình phát triển phần mềm một cách có tổ chức. Bằng cách sử dụng các nhánh release, tính năng và hotfix, Git Flow hỗ trợ việc phân chia công việc rõ ràng và xử lý các vấn đề hiệu quả. Áp dụng Git Flow sẽ giúp bạn duy trì sự nhất quán trong dự án và dễ dàng quản lý các phiên bản phần mềm.

VietnamWorks inTECH hy vọng từ những chia sẻ trên đây các bạn đã phần nào hiểu rõ hơn về Git Flow, nếu thấy bài viết hữu ích đừng quên chia sẻ cho bạn bè cùng biết nhé.

VietnamWorks inTECH

TẠO TÀI KHOẢN MỚI: XEM FULL “1 TÁCH CODEFEE” - NHẬN SLOT TƯ VẤN CV TỪ CHUYÊN GIA - CƠ HỘI RINH VỀ VOUCHER 200K