866 words
4 minutes
Git & Git Flow
2024-05-01

Lời mở đầu#

Trong quá trình phát triển phần mềm, chắc chắn các bạn sẽ phải làm theo team. Gitflow là một mô hình nhánh (branching model) và công cụ giúp tổ chức công việc phát triển phần mềm hiệu quả hơn. Nó hỗ trợ quản lý các nhánh trong quy trình phát triển, đảm bảo sự rõ ràng trong cách triển khai, kiểm thử, và phát hành phần mềm.

Gitflow phù hợp với các dự án có vòng đời phát triển dài, nhiều thành viên, và yêu cầu kiểm soát chặt chẽ giữa các giai đoạn. Công cụ được triển khai qua lệnh git flow giúp tự động hóa việc tạo, hợp nhất, và xóa các nhánh theo quy tắc.


Các nhánh chính trong Gitflow#

Gitflow định nghĩa 5 loại nhánh với các vai trò khác nhau:

1. Nhánh chính (Permanent Branches)#

master#

  • Mục đích: Chứa mã nguồn ổn định đã triển khai lên production.
  • Quy tắc:
    • Chỉ merge từ release hoặc hotfix.
    • Mọi commit trên nhánh này phải đi kèm kiểm thử kỹ lưỡng.
  • Thực tế:
    • Khi khách hàng yêu cầu hotfix khẩn cấp (ví dụ, fix lỗi thanh toán không thành công), tạo nhánh hotfix/bug-payment-fix từ master.

develop#

  • Mục đích: Chứa mã nguồn cập nhật mới nhất, chưa phát hành nhưng đã sẵn sàng kiểm thử.
  • Quy tắc:
    • Là nơi hợp nhất của tất cả các nhánh feature.
    • Sử dụng để chuẩn bị cho các bản phát hành (release).
  • Thực tế:
    • Sau khi hoàn thành tính năng mới, DEV tạo Pull Request từ feature/add-payment-method vào develop.

2. Nhánh phụ (Temporary Branches)#

feature/*#

  • Mục đích: Phát triển các chức năng mới.
  • Cách tạo:
    git flow feature start add-user-login
    
  • Thực tế:
    • Khi cần thêm tính năng đăng nhập cho ứng dụng, tạo nhánh feature/add-user-login từ develop. Sau khi hoàn tất, DEV merge lại vào develop và xóa nhánh feature/add-user-login.

Công cụ và command cơ bản của Gitflow#

  • Cài đặt Gitflow: git flow init.
  • Tạo nhánh mới:
    • Feature: git flow feature start feature-name.
    • Release: git flow release start release-name.
    • Hotfix: git flow hotfix start hotfix-name.
  • Kết thúc nhánh:
    • Feature: git flow feature finish feature-name.
    • Release: git flow release finish release-name.
    • Hotfix: git flow hotfix finish hotfix-name.

Các lệnh Git thường dùng#

LệnhÝ nghĩa
git addThêm thay đổi vào Staging Area.
git commitLưu thay đổi vào Local Repository.
git pushĐẩy thay đổi từ Local Repository lên Remote Repository.
git pullCập nhật code mới từ Remote Repository vào Working Directory.
git fetchLấy dữ liệu từ Remote Repository về Local Repository.
git branchTạo và quản lý các nhánh.
git checkoutChuyển đổi giữa các nhánh làm việc.
git mergeGộp các nhánh lại với nhau.
git rebaseTái cấu trúc lịch sử commit để gọn gàng hơn.
git resetHoàn tác thay đổi ở các cấp độ khác nhau.
git statusKiểm tra trạng thái hiện tại của Working Directory.
git logXem lịch sử commit.
git diffSo sánh sự khác biệt giữa các phiên bản.
git tagTạo, liệt kê và quản lý tag.

Convention khi làm việc với Gitflow#

Quy ước về nhánh:#

  • Tính năng: feature/*
  • Sửa lỗi: bugfix/*
  • Phát hành: release/*
  • Hotfix: hotfix/*

Quy ước về commit:#

  • feat: Thêm chức năng mới.
  • fix: Sửa lỗi.
  • chore: Thay đổi không ảnh hưởng đến logic (ví dụ: cấu hình, tài liệu).
  • refactor: Cải thiện code mà không thay đổi chức năng.

Quy trình làm việc với Gitflow#

1. Đối với DEV#

  • Trách nhiệm chính:
    • Phát triển tính năng (feature).
    • Sửa lỗi (bugfix, hotfix).
  • Quy trình:
    1. Khởi tạo nhánh mới từ develop hoặc master (tùy trường hợp).
      git flow feature start add-new-payment
      
    2. Làm việc trên nhánh riêng, commit thay đổi.
      git add .
      git commit -m "feat: add new payment method"
      
    3. Khi hoàn tất, tạo Pull Request để merge vào develop.
    4. Xóa nhánh sau khi được merge:
      git flow feature finish add-new-payment
      

2. Đối với LEAD#

  • Trách nhiệm chính:
    • Đánh giá code, đảm bảo chất lượng trước khi merge.
    • Tổ chức nhánh release để chuẩn bị phát hành.
  • Quy trình:
    1. Kiểm tra nhánh develop trước khi tạo nhánh release:
      git flow release start v1.1.0
      
    2. Sửa lỗi và cập nhật tài liệu nếu cần thiết.
    3. Merge release vào masterdevelop khi hoàn tất:
      git flow release finish v1.1.0
      

3. Đối với EM#

  • Trách nhiệm chính:
    • Quản lý việc phát hành và sửa lỗi khẩn cấp.
    • Đảm bảo mọi thay đổi quan trọng đều được cập nhật vào cả masterdevelop.
  • Quy trình:
    1. Khi có lỗi khẩn cấp, tạo nhánh hotfix từ master:
      git flow hotfix start fix-crash-error
      
    2. Sửa lỗi, kiểm tra kỹ lưỡng, và merge vào master:
      git flow hotfix finish fix-crash-error
      

Case Study: Triển khai Gitflow trong một Sprint thực tế#

Bối cảnh#

Sprint RC13 kéo dài từ ngày 01/10/2023 đến 15/10/2023, yêu cầu 3 bản phát hành:

  • RC13-release1: Ngày 05/10/2023
  • RC13-release2: Ngày 10/10/2023
  • RC13-release3: Ngày 15/10/2023

Quy trình thực hiện#

  1. Phân chia công việc:

    • Tạo nhánh feature cho các PBI:
      git flow feature start add-user-authentication
      git flow feature start improve-performance
      
    • Merge các tính năng đã hoàn thành vào develop.
  2. Chuẩn bị phát hành:

    • Trước ngày phát hành RC13-release1, tạo nhánh release:
      git flow release start RC13-release1
      
    • Fix lỗi trên nhánh release nếu cần và merge vào master.
  3. Sửa lỗi khẩn cấp:

    • Nếu RC13-release2 gặp lỗi nghiêm trọng sau khi phát hành, tạo nhánh hotfix:
      git flow hotfix start fix-login-error
      
    • Sửa lỗi, kiểm tra, và merge lại masterdevelop.

Quy tắc trong dự án sử dụng Gitflow#

  1. Không pass CI/CD pipeline → Reject pull request.
  2. Code phải được review tối thiểu 2 người.
  3. Không được commit trực tiếp lên master hoặc develop.

Kết luận#

Gitflow mang lại sự rõ ràng và tổ chức tốt hơn cho quy trình phát triển phần mềm, đặc biệt với các dự án quy mô lớn. Việc hiểu và áp dụng Gitflow sẽ giúp team làm việc hiệu quả hơn, giảm thiểu xung đột code, và đảm bảo sản phẩm chất lượng cao khi đến tay khách hàng.

Git & Git Flow
https://www.devwithshawn.com/posts/git-gitflow/
Author
PDXuan(Shawn)
Published at
2024-05-01