
Trả lời nhanh: Git worktree cho phép một repo mở nhiều thư mục làm việc cùng lúc, mỗi thư mục checkout một nhánh riêng: git worktree add ../shop-feature-a feature-a tạo thư mục mới trên nhánh feature-a trong khi thư mục chính vẫn ở main. Với người dùng Claude Code, đây là chìa khóa chạy nhiều agent song song: mỗi agent một worktree một nhánh, làm việc độc lập, không giẫm file nhau, xong việc thì merge từng nhánh về như làm việc nhóm bình thường.
Chạy một agent đã quen rồi, câu hỏi kế tiếp của dân vibe code luôn là: "cho hai ba con chạy cùng lúc được không?" Được, nhưng nếu cả đám cùng sửa một thư mục thì thành thảm họa: con này build trong lúc con kia đổi file, git lẫn lộn tùng phèo. Lời giải có sẵn trong git từ lâu mà ít người biết: worktree. Bài này từ khái niệm đến quy trình vận hành một 'xưởng' nhiều agent trên VPS.
- Worktree = một repo, nhiều thư mục làm việc; chung lịch sử git, riêng file đang mở
- Mỗi agent một worktree + một nhánh + một phiên tmux, công thức song song an toàn
- Không tốn dung lượng gấp đôi phần .git (dùng chung), chỉ tốn phần file làm việc
- Nhiều worktree cùng build = I/O dồn dập cùng lúc, đúng bài của ổ NVMe queue sâu
Worktree hoạt động thế nào
Bình thường một repo = một thư mục = một nhánh đang checkout; muốn làm nhánh khác phải stash rồi switch, hoặc clone thêm bản nữa (tốn chỗ, hai lịch sử rời nhau). Worktree là đường thứ ba:
cd ~/shop # repo chinh, dang o main
git worktree add ../shop-thanh-toan feature/thanh-toan
git worktree add ../shop-seo -b feature/seo # -b: tao nhanh moi luon
git worktree listGiờ có ba thư mục cùng trỏ về một kho .git: lịch sử, commit, stash dùng chung; file đang làm việc riêng biệt hoàn toàn. Commit ở worktree nào nằm trên nhánh của worktree đó, sạch sẽ như ba người ba máy, gọn như một repo.
Công thức nhiều agent song song trên VPS
Mỗi agent nhận một bộ ba worktree + nhánh + phiên tmux:
# viec 1: lam trang thanh toan
tmux new -s thanh-toan
cd ~/shop-thanh-toan && claude # giao viec roi Ctrl+B D thoat
# viec 2: toi uu SEO, song song, khong dung viec 1
tmux new -s seo
cd ~/shop-seo && claudeHai agent giờ cày hai việc độc lập: file riêng, nhánh riêng, log riêng. Bạn attach lần lượt từng phiên nghiệm thu, nhánh nào đạt thì merge:
cd ~/shop && git merge feature/thanh-toan && ./deploy.shQuy ước đáng theo ngay từ đầu: tên thư mục = tên phiên tmux = đuôi tên nhánh, nhìn đâu cũng biết cái gì thuộc việc gì.
Những điều cần biết trước khi phụ thuộc vào nó
- Một nhánh chỉ checkout được ở một worktree, git chặn sẵn để khỏi tự bắn vào chân.
- node_modules không dùng chung: mỗi worktree tự cài (npm ci từng thư mục), tốn thêm dung lượng và một lượt cài, đổi lại cách ly tuyệt đối. Ổ NVMe làm phần này bớt đau hẳn.
- Port đụng nhau: hai worktree cùng chạy dev server phải khác PORT, ghi quy ước vào CLAUDE.md để agent tự biết (worktree A port 3001, B port 3002...).
- Dọn dẹp khi xong:
git worktree remove ../shop-seogỡ thư mục,git worktree prunequét xác chết. Đừng rm -rf tay, git còn giữ sổ sách.
Vì sao trò này ăn ổ đĩa - và cấu hình nên có
Ba worktree cùng hoạt động nghĩa là có lúc: ba npm ci cùng bung hàng vạn file, ba build cùng ghi cache, ba agent cùng grep toàn repo. I/O không xếp hàng lịch sự, chúng dồn cục. Ổ SATA queue nông sẽ nghẽn thấy rõ (mọi thứ cùng chậm lại); ổ NVMe với hàng đợi lệnh sâu nuốt kiểu tải này êm. RAM tính đơn giản: mỗi phiên agent + dev server đội chừng 1-1.5 GB, ba việc song song thoải mái trong gói 8 GB. CPU xung cao vẫn là vua vì mỗi tiến trình build/agent phần lớn đơn luồng.
Mẹo nâng cao cho người đã quen
- Worktree 'trực ban': giữ một worktree luôn ở main sạch để hotfix khẩn, không phải chờ agent nào xong việc.
- Đặt hết worktree trong một thư mục cha (~/wt/shop-*), backup, dọn dẹp, liếc danh sách một phát thấy hết.
- Review chéo bằng agent: xong nhánh A, mở phiên mới cho agent khác review diff nhánh A trước khi merge, người quyết vẫn là bạn, nhưng có thêm một vòng soi lỗi miễn phí.
Bộ lệnh vận hành xưởng nhiều worktree
git worktree list # xem dang co nhung thu muc lam viec nao git worktree add ../shop-seo -b feature/seo # tao worktree + nhanh moi git worktree remove ../shop-seo # xoa khi xong viec git worktree prune # don cac ban ghi mo coi sau khi xoa tay thu muc git branch -d feature/seo # xoa nhanh sau khi da merge
Ba quy tắc giữ cho xưởng không loạn:
- Một nhánh chỉ được checkout ở một worktree. Git từ chối nếu bạn thử mở cùng một nhánh ở hai chỗ, và đây là tính năng chứ không phải hạn chế.
- Xóa worktree bằng lệnh, đừng xóa thư mục bằng tay. Xóa tay thì bản ghi vẫn còn, phải chạy
git worktree prunemới sạch. - Đặt tên thư mục theo tên nhánh. Sau ba ngày với năm worktree, tên kiểu
shop-2là không ai nhớ nổi cái nào đang làm gì.
Những thứ không dùng chung giữa các worktree
| Thứ | Dùng chung | Ghi chú |
|---|---|---|
| Lịch sử commit, nhánh, tag | Có | Cùng một kho .git |
| Stash | Có | Stash ở worktree này thấy được ở worktree kia |
| Thư mục thư viện đã cài | Không | Mỗi worktree phải cài riêng, đây là chỗ tốn dung lượng và thời gian |
| Tệp môi trường không theo dõi | Không | Tệp .env phải chép sang từng worktree |
| Bộ nhớ đệm build | Không | Mỗi worktree build riêng, đây là lý do ổ đĩa quan trọng |
| Cấu hình git cục bộ | Có | Đặt ở kho chính, mọi worktree dùng chung |
Hai dòng giữa là chi phí thật của mô hình này. Ba worktree cho một dự án Node nghĩa là ba thư mục thư viện, mỗi cái vài trăm megabyte tới vài gigabyte. Cách giảm: dùng trình quản lý gói có kho chung theo máy, khi đó các worktree chia sẻ cùng một kho tệp thay vì chép lại.
Kịch bản dựng và dọn worktree
#!/bin/bash # tao-worktree.sh ten-viec set -e TEN=$1 git worktree add "../$(basename $PWD)-$TEN" -b "feature/$TEN" cd "../$(basename $PWD)-$TEN" cp ../$(basename $OLDPWD)/.env .env 2>/dev/null || true npm ci tmux new -d -s "$TEN" -c "$PWD" echo "Xong. Vao bang: tmux attach -t $TEN"
Kịch bản này làm đủ bốn việc hay quên: tạo worktree, chép tệp môi trường, cài thư viện, và mở sẵn một phiên làm việc. Khi xong việc thì gộp nhánh về, tmux kill-session -t ten, rồi git worktree remove.
Trước khi chạy nhiều agent cùng lúc
- Đếm tài nguyên. Mỗi worktree đang build chiếm một phần vi xử lý và bộ nhớ. Máy 4 nhân 8 GB thì hai worktree là hợp lý, ba là bắt đầu tranh nhau. Xem thực tế bằng
htoplúc cả hai đang chạy. - Tách cổng. Hai máy chủ phát triển cùng chạy cổng 3000 là một cái không lên. Đặt cổng theo tên việc và ghi vào tệp môi trường của từng worktree.
- Tách cơ sở dữ liệu. Hai nhánh cùng chạy di trú cơ sở dữ liệu trên một kho dữ liệu là hỏng dữ liệu. Mỗi worktree một cơ sở dữ liệu riêng, hoặc ít nhất một lược đồ riêng.
- Gộp về theo thứ tự. Gộp từng nhánh một, chạy kiểm thử sau mỗi lần gộp. Gộp cả ba cùng lúc rồi mới chạy kiểm thử là mất luôn khả năng biết nhánh nào gây lỗi.
Câu hỏi thường gặp
Worktree khác gì clone repo ra hai thư mục?
Clone đôi = hai kho .git rời: fetch hai lần, nhánh không thấy nhau ngay, tốn chỗ gấp đôi. Worktree chung một kho: commit bên này bên kia thấy liền, stash chung, dung lượng chỉ tốn phần file làm việc.
Chạy mấy agent song song là hợp lý?
Giới hạn thật không phải máy mà là sức nghiệm thu của bạn: 2-3 việc song song là điểm ngọt, đủ nhanh gấp bội, vẫn đủ sức duyệt kỹ từng nhánh. Máy 8 GB RAM + NVMe gánh mức này nhẹ nhàng.
Hai agent sửa trùng một file ở hai worktree thì sao?
Không đụng nhau lúc làm (file riêng), chỉ gặp nhau lúc merge, git báo conflict như làm việc nhóm bình thường, và bạn (hoặc chính agent) giải quyết. Phòng bệnh: chia việc theo khu vực code ngay trong đề bài giao cho từng agent.
Worktree có dùng được với dự án không phải Node không?
Worktree là tính năng git thuần, Python, Go, PHP gì cũng chạy. Chỉ lưu ý phần môi trường riêng từng thư mục (venv, vendor...) tương tự chuyện node_modules.
Bài viết liên quan
- Chạy nhiều phiên Claude Code song song trên một VPS
- tmux là gì? Để Claude Code chạy khi tắt laptop
- VPS ổ Enterprise U.2 NVMe RAID 10 tại TND
- Gemini API: lấy key miễn phí + tích hợp vào AI agent trên VPS
- OpenClaw là gì? Hướng dẫn self-host OpenClaw trên VPS TND từ A-Z
- Headscale: tự host control server Tailscale trên VPS
- Deploy Next.js preview qua Cloudflare Tunnel trên VPS 2GB không cần Vercel
- Proxy IPv4 Dedicated vs Shared vs Residential 2026
- gemini --yolo



