Sử dụng git-flow để tự động hóa workflow

Trong bài viết trước về giới thiệu git, chúng ta đã được thấy một trong những workflow cho git rất hiệu quả để tracking các feature, hotfix hay release branch cho dự án. Đây chính là workflow của anh Vincent Driessen với bài viết A successful Git branching model rất chi tiết.

Tuy nhiên, với việc phải nhớ khá nhiều lệnh để hiện thực hóa, nhất là khi có nhân sự mới chưa biết nhiều về workflow này thì việc hướng dẫn khá mất thời gian và dễ gây sai sót. Chính vì thế Vincent Driessen đã xây dựng một git-flow library of git subcommands nhằm tự động hóa hầu hết các phần của flow trên để làm việc một cách nhanh chóng về dễ dàng hơn.

Làm thế nào để cài đặt?

Github: https://github.com/nvie/gitflow

Để cài đặt git-flow chỉ cần chọn OS và xem hướng dẫn tại: https://github.com/nvie/gitflow/wiki/Installation.

Điểm hay là git-flow hỗ trợ tốt các công cụ trên Windows như cygwin, tương thích rất hoàn hảo.

Khởi tạo và bắt đầu sử dụng git-flow

Sau khi cài đặt, bạn vào thư mục chính của project (không quan trọng đã sử dụng git hay chưa), hãy sử dụng init để khởi tạo git-flow.

$ 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: [master]
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-flow sẽ cho phép bạn lựa chọn tên các branch chính cũng như format của các prefix của project hiện tại đang (hoặc muốn) sử dụng. Việc này sẽ đảm bảo việc sử dụng branch sẽ được chuẩn hóa và sẽ không gây bất kì nhầm lẫn nào về việc đặt tên trong tương lai.

Nếu muốn sử dụng config mặc định và khởi tạo nhanh, hãy thêm -d vào đằng sau init.

Sử dụng git-flow như thế nào?

Feature branches

git-flow làm cho việc làm việc mới nhiều feature trong cùng một thời điểm trở nên dễ dàng hơn, giả sử bạn muốn làm tính năng “authentication” cho ứng dụng với tên branch tương ứng thì cần sử dụng lệnh sau để tạo mới branch:

$ git flow feature start authentication
Switched to a new branch 'feature/authentication'

Summary of actions:
- A new branch 'feature/authentication' was created, based on 'develop'
- You are now on branch 'feature/authentication'

Now, start committing on your feature. When done, use:

     git flow feature finish authentication

Có thể thấy trong command line đã ghi rõ tên branch mới, được tách từ branch nào (develop) và bạn sử dụng nó như một branch bình thường. Sau khi làm xong tính năng, commit đầy đủ bạn chỉ việc sử dụng lệnh finish để merge branch vào branch chính và delete nó (ở phía local) đi.

$ git flow feature finish authentication
Switched to branch 'develop'
Updating 9060376..00bafe4
Fast-forward
 authentication.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 authentication.txt
Deleted branch feature/authentication (was 00bafe4).

Summary of actions:
- The feature branch 'feature/authentication' was merged into 'develop'
- Feature branch 'feature/authentication' has been removed
- You are now on branch 'develop'

Về cơ bản git-flow sử dụng lệnh git merge –no-ff feature/authentication để merge vì thế sẽ không xảy ra hiện tượng mất lịch sử commit.

Tuy nhiên, lệnh này chỉ nên thực hiện khi đã review hoàn chỉnh và được coi như là việc accept một merge request (hay pull request).

Versioned releases

Nếu bạn cần tag (đánh dấu) và release một version của sản phẩm, bạn cũng có thể sử dụng release branch của git-flow để tạo một branch mới khi bạn sẵn sàng để deploy một phiên bản mới ra production.

Để chuẩn bị release, bạn hãy sử dụng lệnh release start + số version:

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

Summary of actions:
- A new branch 'release/0.1.0' was created, based on 'develop'
- You are now on branch 'release/0.1.0'

Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:

     git flow release finish '0.1.0'

Một release branch kèm với số version sẽ được tạo và được mô tả rõ ràng, bạn có thể thao tác những bước kiểm tra, sửa lỗi,… cuối cùng và commit chúng lên. Cuối cùng hãy sử dụng finish (giống như feature) để chính thức release sản phẩm ra môi trường production.

$ git flow release finish 0.1.0
Switched to branch 'master'
Merge made by the 'recursive' strategy.
 authentication.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 authentication.txt
Deleted branch release/0.1.0 (was 1b26f7c).

Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged '0.1.0'
- Release branch has been back-merged into 'develop'
- Release branch 'release/0.1.0' has been deleted

Vậy là xong, sản phẩm đã được tag, merge vào master và release branch sẽ được xóa đi. Tất cả chỉ nằm trong một câu lệnh, và cũng giống feature, hãy cẩn thận review cẩn thận.

Hotfixing production code

Rất có thể sau khi relase sản phẩm cho những bug bất ngờ, khi đó, ta có thể xử lý vấn đề nhanh chóng và rõ ràng với hotfix branch. Ví dụ:

$ git flow hotfix start assets
Switched to a new branch 'hotfix/assets'

Summary of actions:
- A new branch 'hotfix/assets' was created, based on 'master'
- You are now on branch 'hotfix/assets'

Follow-up actions:
- Bump the version number now!
- Start committing your hot fixes
- When done, run:

     git flow hotfix finish 'assets'

Sau khi hotfix branch được tạo, hãy sửa những lỗi đang tồn tại và commit, cuối cùng sử dụng finish để merge phần sửa lỗi vào 2 branch chính (develop và master).

$ git flow hotfix finish assets
Switched to branch 'master'
Merge made by the 'recursive' strategy.
 assets.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 assets.txt
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
 assets.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 assets.txt
Deleted branch hotfix/assets (was 08edb94).

Summary of actions:
- Latest objects have been fetched from 'origin'
- Hotfix branch has been merged into 'master'
- The hotfix was tagged '0.1.1'
- Hotfix branch has been back-merged into 'develop'
- Hotfix branch 'hotfix/assets' has been deleted

Có thể thấy git-flow đã đảm bảo chặt chẽ quy trình sử dụng hotfix trong workflow, nếu sử dụng lệnh bình thường rất có thể sẽ bị quên merge vào develop.

Kết luận

Với những gì git-flow đã làm được, tất nhiên không thể nói git-flow thay thế hoàn toàn trong khi làm việc nhưng nó cũng đã giúp tiết kiệm rất nhiều thời gian cũng như tránh các sai sót trong quá trình làm theo flow này. Hãy thử sử dụng và tận hưởng những lợi ích mà git-flow đem lại, giúp tăng hiệu quả làm việc khi sử dụng git.

Tham khảo