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
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ống | Là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 rebase | Chỉ 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 file | Là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 main | Nhánh dài hạn | |
|---|---|---|
| Code lên production | Vài phút sau mỗi push | Chỉ khi merge |
| Merge | Gần như không có: rebase nhỏ, liên tục | Merge lớn, càng để lâu càng đau |
| Xung đột | Hiếm, nhỏ | Thường xuyên, vì các app chung API, D1, packages/ |
| Migration D1 | Một dãy, áp ngay | Nhiều nhánh cùng thêm migration vào một database |
| Sửa code chung | Mọi app nhận ngay | Sử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.