Release Branch là một nhánh trong Git Flow được tạo từ develop để chuẩn bị một bản phát hành cụ thể cho việc triển khai. Trong nhánh này, phiên bản ứng dụng được cố định, các lỗi cuối cùng được sửa và siêu dữ liệu được cập nhật — mà không thêm tính năng mới. Theo Vincent Driessen, 2010, nhánh release tách biệt việc chuẩn bị phát hành khỏi phát triển hiện tại, cho phép cả hai hoạt động diễn ra song song.
Những điểm chính
release/X.Y.Z theo phiên bản ứng dụng.Release Branch (nhánh phát hành) là một nhánh tạm thời trong Git Flow, được tạo từ develop khi nhóm quyết định rằng tập hợp tính năng hiện tại đã sẵn sàng để phát hành. Nó tồn tại chính xác trong khoảng thời gian chuẩn bị phát hành cuối cùng — từ vài giờ đến vài ngày.
Mục đích chính của nhánh release là cố định một tập hợp tính năng cụ thể cho bản phát hành mà không dừng phát triển các phiên bản tiếp theo. Trong khi nhánh release đang được chuẩn bị để triển khai, các nhà phát triển khác có thể tiếp tục hợp nhất các nhánh tính năng vào develop cho bản phát hành tiếp theo.
Không có tính năng mới nào được tạo trong nhánh release — chỉ sửa lỗi, cập nhật phiên bản ứng dụng, bản địa hóa và tài liệu. Sau khi hoàn tất tất cả công việc, nhánh release được hợp nhất vào main (đánh dấu là bản phát hành) và trở lại develop (để các bản sửa lỗi đến được các phiên bản tương lai).
Theo Atlassian, 2024, các nhánh release cực kỳ quan trọng đối với các dự án có chu kỳ phát hành thường xuyên — chúng đảm bảo tính dự đoán và ổn định của quy trình phát hành.
Vòng đời của nhánh release từ khi tạo đến khi xóa bao gồm nhiều giai đoạn. Hiểu từng giai đoạn giúp nhóm đồng bộ hóa hành động và tránh sai lầm.
release/2.5.0 được tạo. develop tiếp tục chấp nhận các nhánh tính năng cho phiên bản tiếp theo.v2.5.0.Bước 6 — hợp nhất ngược vào develop — thường bị quên nhưng cực kỳ quan trọng. Nếu không có nó, các bản sửa lỗi được thực hiện trong nhánh release sẽ không đến được develop và các lỗi tương tự có thể xuất hiện lại trong bản phát hành tiếp theo.
Thời gian tồn tại của nhánh release phụ thuộc vào độ phức tạp của bản phát hành và chất lượng mã trong develop. Trung bình, việc chuẩn bị mất từ 2 đến 5 ngày làm việc đối với một ứng dụng di động cỡ trung bình.
Trong nhánh release, một tập hợp nhiệm vụ giới hạn nghiêm ngặt được thực hiện. Bất kỳ sai lệch nào khỏi danh sách này đều vi phạm mô hình Git Flow và tạo rủi ro cho sự ổn định của bản phát hành.
| Loại thay đổi | Được phép | Ví dụ |
|---|---|---|
| Quản lý phiên bản | Có | Cập nhật versionName trong build.gradle |
| Sửa lỗi | Có | Sửa lỗi treo khi khởi động |
| Bản địa hóa | Có | Thêm bản dịch cho màn hình mới |
| Tài liệu | Có | Cập nhật CHANGELOG và README |
| Tính năng mới | Không | Thêm màn hình hồ sơ mới |
| Tái cấu trúc | Không | Viết lại lớp mạng |
| Cập nhật thư viện | Thận trọng | Chỉ phiên bản patch để sửa lỗi |
Quy tắc cấm tính năng mới là quan trọng nhất trong nhánh release. Nếu một tính năng không kịp cho bản phát hành, nó chờ chu kỳ tiếp theo. Cố gắng đẩy một tính năng chưa hoàn thành vào nhánh release là nguyên nhân chính dẫn đến trễ hạn và lỗi trong sản phẩm.
Trong nhánh release, số phiên bản ứng dụng bắt buộc phải được cập nhật. Đối với Android, đó là các trường versionCode và versionName trong build.gradle; đối với iOS — CFBundleShortVersionString trong Info.plist.
// build.gradle (cấp ứng dụng) — cập nhật phiên bản trong nhánh release
android {
defaultConfig {
versionCode 42
versionName "2.5.0"
}
}
// Đối với iOS — cập nhật Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42
Các nhà phát triển mới thường nhầm lẫn giữa nhánh release và hotfix, mặc dù mục đích của chúng hoàn toàn khác nhau. Chọn sai loại nhánh có thể làm chậm bản sửa lỗi quan trọng hoặc làm gián đoạn quy trình phát hành.
Nếu lỗi được tìm thấy trong quá trình chuẩn bị phát hành (trong nhánh release) — đó là sửa lỗi thông thường. Nếu lỗi được tìm thấy trong sản phẩm (trên main) — đó là hotfix và nó được tạo từ main, ngay cả khi nhánh release đã tồn tại.
Một tiêu chuẩn thống nhất về đặt tên nhánh release giúp đơn giản hóa việc điều hướng kho lưu trữ và cho phép hệ thống CI/CD tự động phát hiện nhánh thuộc quy trình phát hành.
release/2.5.0.release/merlin.release/2024-12-01.Định dạng release/X.Y.Z được ưa chuộng vì nó liên kết rõ ràng nhánh với số phiên bản sẽ được gán cho bản phát hành. Điều này đơn giản hóa việc tìm kiếm và xử lý tự động bằng các tập lệnh CI/CD.
Hợp nhất ngược (merge back) của nhánh release vào develop là một trong những thao tác quan trọng nhất và đồng thời thường bị bỏ qua nhất. Nếu không có nó, tất cả các bản sửa lỗi được thực hiện trong nhánh release chỉ còn lại trong phiên bản phát hành và không đến được chu kỳ phát hành tiếp theo.
Quá trình hợp nhất ngược được thực hiện sau khi nhánh release đã được hợp nhất vào main. Đầu tiên, release được hợp nhất vào develop, sau đó bị xóa. Điều này đảm bảo rằng develop chứa tất cả các bản sửa lỗi được thực hiện trong quá trình chuẩn bị phát hành.
Sau khi hợp nhất ngược, xung đột có thể xảy ra — đặc biệt nếu các nhánh tính năng mới đã xuất hiện trong develop và đã sửa đổi cùng các tệp. Nhà phát triển chịu trách nhiệm về bản phát hành giải quyết các xung đột này và đẩy develop lên máy chủ.
Một số nhóm sử dụng rebase thay vì merge để hợp nhất ngược nhằm giữ lịch sử tuyến tính. Tuy nhiên, merge an toàn hơn cho develop vì nó không ghi lại lịch sử commit mà các nhà phát triển khác có thể đã sử dụng.
Hãy xem xét toàn bộ chu kỳ làm việc với nhánh release: từ tạo đến xóa sau khi phát hành thành công ứng dụng di động phiên bản 2.5.0.
# 1. Tạo nhánh release từ develop
git checkout develop
git pull origin develop
git checkout -b release/2.5.0
# 2. Cập nhật phiên bản và sửa lỗi
git add build.gradle
git commit -m "Bump version to 2.5.0"
# 3. Sửa lỗi (chỉ bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"
# 4. Đẩy nhánh release lên máy chủ
git push origin release/2.5.0
# 5. Hợp nhất release vào main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags
# 6. Hợp nhất ngược vào develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop
# 7. Xóa nhánh release
git branch -d release/2.5.0
git push origin --delete release/2.5.0
Lệnh 5 và 6 — hợp nhất kép — cực kỳ quan trọng. Đầu tiên, main nhận mã phát hành và thẻ, sau đó develop đồng bộ hóa với các bản sửa lỗi từ release. Nếu bỏ qua bước 6, các bản sửa lỗi từ bản phát hành sẽ không đến được chu kỳ phát triển tiếp theo.
Đối với các dự án di động có bản phát hành thường xuyên, quy trình tạo nhánh release và cập nhật phiên bản có thể được tự động hóa thông qua các tập lệnh CI/CD. GitHub Actions cho phép tạo một quy trình làm việc mà khi nhấn nút sẽ tạo nhánh release với cập nhật phiên bản tự động.
Đối với các dự án di động có bản phát hành thường xuyên, quy trình tạo nhánh release và cập nhật phiên bản có thể được tự động hóa thông qua các tập lệnh CI/CD. GitHub Actions cho phép tạo một quy trình làm việc mà khi nhấn nút sẽ tạo nhánh release với cập nhật phiên bản tự động.
# GitHub Actions — tự động hóa tạo nhánh release
name: Create Release Branch
on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 2.5.0)'
required: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create release branch
run: |
git checkout develop
git checkout -b release/${{ inputs.version }}
git push origin release/${{ inputs.version }}
Câu hỏi thường gặp
Chỉ một nhánh release tại một thời điểm nếu bạn tuân theo Git Flow. Có hai nhánh release hoạt động có nghĩa là nhóm đang cố gắng phát hành hai phiên bản song song — điều này vi phạm nguyên tắc phát hành tuần tự và gây nhầm lẫn về phiên bản.
Xóa các commit của tính năng chưa hoàn thành khỏi nhánh release thông qua git revert và hoãn tính năng đó đến bản phát hành tiếp theo. Không bao giờ phát hành chức năng chưa hoàn thành ra sản phẩm — nợ kỹ thuật và lỗi tiềm ẩn không đáng để vội vàng.
Đối với các bản phát hành đơn giản với một bản sửa lỗi, có thể bỏ qua nhánh release và hợp nhất trực tiếp từ develop vào main. Tuy nhiên, đối với các bản phát hành tiêu chuẩn, nhánh release là bắt buộc — nó cố định phiên bản, cô lập việc chuẩn bị và đảm bảo hợp nhất kép các bản sửa lỗi.
Sử dụng git revert trên main để tạo commit mới hoàn tác tất cả thay đổi của bản phát hành. Sau đó xóa thẻ phát hành bằng lệnh git push origin --delete vX.Y.Z. Sau khi sửa các vấn đề, hãy tạo nhánh release mới với số patch tăng lên.
Release candidate (RC) là một tạo phẩm xây dựng trải qua kiểm thử cuối cùng. Release branch là nhánh Git mà từ đó release candidate được xây dựng. Một nhánh release có thể tạo ra nhiều bản dựng RC (RC1, RC2, v.v.) khi các lỗi được sửa.
Tổng kết
release/X.Y.Z với số phiên bản SemVer.Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm