Skip to content

Làm thẳng trên main ​

Bản lệnh dựng lại harness (18.10.2026) đề xuất kiểu trunk-based: không PR, không nhánh dài hạn, code đã kiểm thì push thẳng lên main và CI deploy trong vài phút. Trang này mô tả thiết kế đó. Conan chưa đổi sang kiểu này; xem mục Ở Conan hôm nay và quyết định ở Audit.

Luồng của một thay đổi ​

bash
git commit -m "..."              # pre-commit: lint + typecheck file đã stage + cổng khớp đường dẫn (dưới 5 s)
git pull --rebase origin main    # lấy commit của phiên khác, đặt commit của mình lên trên
git push origin HEAD:main        # pre-push: typecheck + unit test workspace bị đụng (dưới 60 s)

Nối commit && push bằng &&, không bằng ;: commit hỏng thì không được push.

Sau khi push, CI trên main (một job) chạy lại cổng rồi deploy đúng các app bị đụng. CI đỏ thì không deploy, và workflow auto-revert tự tạo commit đảo ngược commit đỏ.

Tình huốngLàm gì
Push bị từ chối ([rejected] ... fetch first)Một phiên khác vừa push. Chạy lại git pull --rebase, rồi push.
Xung đột khi rebaseChỉ xảy ra khi hai phiên sửa cùng dòng. Gỡ trong cây của mình, chạy lại test, push.
Tính năng làm dởĐẩy lên main sau một feature flag, không giữ trên branch.
Việc dài hoặc đụng nhiều fileLàm trong git worktree riêng, trên một nhánh tạm ở máy (git không cho hai worktree cùng checkout main), rồi git push origin HEAD:main. Nhánh tạm không lên GitHub.

Vì sao không giữ nhánh dài hạn ​

Thẳng lên mainNhánh dài hạn
Code lên productionVài phút sau mỗi pushChỉ khi merge
MergeGần như không có: rebase nhỏ, liên tụcMerge lớn, càng để lâu càng đau
Xung độtHiếm, nhỏThường xuyên, vì các app chung API, D1, packages/
Migration D1Một dãy, áp ngayNhiều nhánh cùng thêm migration vào một database
Sửa code chungMọi app nhận ngaySửa nhiều lần hoặc cherry-pick

Thứ thay cho "cô lập bằng branch" là feature flag, và về lâu dài là làn: mỗi phiên một vùng file.

Ở Conan hôm nay ​

Conan đi qua PR và squash merge: 127 PR merge trong 14 ngày tới 18.10.2026. Luật thường trực của chủ dự án: chỉ merge khi CI xanh trên đúng head SHA (gh pr merge --squash --match-head-commit <SHA>), CI xanh thì tự merge rồi làm tiếp, và gom sửa đổi vào ít PR để bớt phút CI.

Hai điểm yếu của cách hiện tại mà trunk sửa được: deploy trên main không chờ ci-checks (không có branch protection ở gói Free, nên "chỉ merge khi xanh" là quy ước, và đã bị vượt hai lần ở #293, #416), và lượt ci-checks trên PR chiếm khoảng một nửa số phút Actions.

Đổi sang trunk là chờ quyết, vì nó đảo luật chủ dự án đã đặt. Điều kiện và thứ tự: Audit, mục 0.