Luồng Merge Nhánh
Git branching · Release flow

Quy trình merge code từ develop đến main

Code đi một chiều qua ba môi trường: kiểm tra nội bộ trên develop, nghiệm thu trên staging, rồi phát hành lên production từ main.

develop→ staging→ main

Sơ đồ luồng nhánh

mainProduction stagingUAT / nghiệm thu developDev / tích hợp PR #1 develop → staging PR #2 staging → main tag v1.4.0 main → develop (đồng bộ)
Merge tiến (promote) Merge ngược sau release ● Lớn: merge commit   ● Nhỏ: commit thường

Từng bước thực hiện

Mục tiêu

Đưa các tính năng đã tích hợp ổn định trên develop lên staging để QA và khách hàng nghiệm thu.

Mở PR
Dev lead hoặc người phụ trách release
Duyệt
1 reviewer + CI xanh
Cách merge
Merge commit (không squash)
Sau merge
Tự động deploy lên môi trường staging

Điều kiện trước khi merge

Lệnh

# 1. Cập nhật nhánh nguồn và đích
git fetch origin
git checkout develop && git pull origin develop
git checkout staging && git pull origin staging

# 2. Thử merge cục bộ để phát hiện conflict
git merge --no-ff develop
# xử lý conflict nếu có, rồi hủy nếu chỉ thử:
# git merge --abort

# 3. Mở Pull Request (khuyến nghị)
gh pr create --base staging --head develop \
  --title "Merge develop into staging"
Nên merge qua Pull Request. Chỉ chạy git merge cục bộ để kiểm tra conflict, đừng push thẳng lên staging.

Quy tắc cần giữ

Chỉ đi một chiều

Promote theo thứ tự develop → staging → main. Không merge tắt từ develop thẳng lên main.

Bảo vệ nhánh

Bật branch protection cho staging và main: bắt buộc PR, review và CI xanh trước khi merge.

Dùng merge commit

Giữa các nhánh dài hạn, dùng --no-ff. Squash và rebase làm lịch sử lệch nhau và gây conflict lặp lại.

Không push trực tiếp

Không push thẳng lên develop, staging hay main, kể cả khi gấp. Dùng PR hoặc quy trình hotfix.

Không force-push

Không push --force và không rebase các nhánh dùng chung.

Mỗi nhánh một môi trường

develop deploy dev, staging deploy UAT, main deploy production. Merge xong CI/CD tự chạy.