
Git Worktree là gì?

Git Worktree là tính năng của Git (được giới thiệu từ Git 2.5 năm 2015) cho phép bạn check out nhiều branch cùng lúc trong các thư mục làm việc riêng biệt — nhưng tất cả cùng chia sẻ một kho chứa (repository) duy nhất. Thay vì chuyển branch qua lại bằng git checkout hay dùng git stash khi đang làm dở, bạn mở một terminal mới, trỏ đến thư mục worktree khác, và làm việc song song.
Khi chạy git clone, Git tạo ra một main worktree (working tree chính) tại thư mục gốc. Mỗi lệnh git worktree add tạo thêm một linked worktree — một thư mục mới có working tree riêng (file code, index, HEAD) nhưng cùng trỏ về chung .git/objects. Điều này có nghĩa: không tốn thêm dung lượng đáng kể, không cần clone lại, và lịch sử commit vẫn thống nhất.
Đây là giải pháp gốc rễ cho bài toán “làm nhiều việc cùng lúc” mà nhiều dev vẫn giải quyết bằng cách clone repo nhiều lần hoặc liên tục git stash / git checkout.
Git Worktree vs các cách làm truyền thống
| Tiêu chí | Git Worktree | git stash + checkout | Clone repo nhiều lần | Shallow clone (–depth=1) |
|---|---|---|---|---|
| Chuyển ngữ cảnh | Gần như tức thì (mở thư mục mới) | Cần stash/commit, checkout | Đã clone sẵn, nhưng thủ công | Tốn thời gian clone lại |
| Dung lượng ổ cứng | Chia sẻ .git/objects — tối thiểu | Không thêm | Nhân lên N lần | Nhẹ nhưng thiếu lịch sử |
| Làm việc song song | ✅ Hoàn toàn | ❌ Chỉ một working tree | ✅ Nhưng không liên kết | ✅ Nhưng không liên kết |
| Lịch sử Git | Đầy đủ | Đầy đủ | Đầy đủ | Chỉ commit gần nhất |
| Độ an toàn WIP | Rất cao (không đụng stash) | Rủi ro mất code khi stash conflict | An toàn | An toàn |
Như bảng so sánh cho thấy, Git Worktree là giải pháp tốt nhất cho đa số trường hợp làm việc song song — vừa nhẹ, vừa an toàn, vừa giữ nguyên lịch sử.
Các lệnh cốt lõi
Tạo worktree mới
# Tạo worktree tại thư mục ../feature-a, check out branch feature-a
git worktree add ../feature-a feature-a
# Tạo worktree VÀ branch mới cùng lúc
git worktree add -b hotfix ../hotfix main
# Tạo worktree detached HEAD (dùng một lần, không cần branch)
git worktree add -d ../review origin/feature-b
Quy tắc: nếu branch đã tồn tại, Git check out branch đó. Nếu branch chưa có, dùng -b để tạo mới. Thư mục worktree thường đặt ngoài thư mục gốc của repo (ví dụ ../feature-a) để tránh lẫn lộn với source gốc.
Quản lý worktree
# Liệt kê tất cả worktree
git worktree list
# Liệt kê chi tiết (HEAD, branch, trạng thái)
git worktree list -v
# Xóa worktree khi đã xong việc
git worktree remove ../feature-a
# Di chuyển worktree sang vị trí khác
git worktree move ../feature-a ~/worktrees/feature-a
# Khóa worktree (ngăn auto-prune khi ở ổ USB/mạng)
git worktree lock ../hotfix
# Dọn dẹp file admin rác
git worktree prune
# Sửa liên kết sau khi di chuyển thủ công
git worktree repair ../feature-a
Các tình huống thực tế
1. Hotfix gấp khi đang refactor bở

Bạn đang giữa chừng refactor một module lớn, working tree đầy file chưa hoàn thành. Sếp báo lỗi critical cần sửa ngay. Thay vì git stash (dễ bị conflict khi restore) hoặc commit tạm (làm bẩn lịch sử):
$ git worktree add -b hotfix ../hotfix main
$ cd ../hotfix
# ... sửa lỗi nhanh ...
$ git commit -am 'fix critical bug'
$ cd ..
$ git worktree remove ../hotfix
# Quay lại thư mục gốc, tiếp tục refactor như không có gì xảy ra
Working tree gốc không bị chạm đến. Hotfix được commit sạch, push lên remote, tạo PR ngay.
2. Phát triển song song nhiều feature
Khi cần làm việc trên feature-a và feature-b cùng lúc (ví dụ một thay đổi API ảnh hưởng đến cả hai):
$ git worktree add ../feature-a feature-a
$ git worktree add ../feature-b feature-b
# Mở 2 terminal, 2 IDE window, làm việc độc lập
# Khi xong: merge/PR từng cái một, rồi xóa worktree
Không cần chuyển branch, không lo trạng thái uncommitted bị lẫn lộn.
3. Code review branch của đồng nghiệp
$ git worktree add -d ../review origin/their-feature
$ cd ../review
$ git diff main
# Chạy test, build, kiểm tra logic
$ cd ..
$ git worktree remove ../review
Dùng -d (detached HEAD) cho review dùng một lần — không tạo branch rác.
4. Chạy test trên branch release
$ git worktree add ../test v2.0-release
$ cd ../test && npm test && cargo test
# Kết quả test không ảnh hưởng working tree chính
Best practices và lưu ý
- Đặt worktree ngoài thư mục repo gốc: Dùng
../feature-namehoặc~/worktrees/feature-name— tránh nested worktree gây khó quản lý - Luôn dùng
git worktree remove: Xóa thư mục thủ công để lại file admin trong.git/worktrees/— dùngprunenếu đã xóa tay - Lock worktree trên ổ di động: Nếu worktree nằm trên USB/network drive, chạy
git worktree lockđể Git không tự prune - Bật config riêng cho worktree:
git config extensions.worktreeConfig truecho phép mỗi worktree có.git/config.worktreeriêng (ví dụ user.name khác nhau) - Chạy
pruneđịnh kỳ: Dọn file admin cũ sau khi xóa worktree
Hạn chế cần biết
- Submodule: Hỗ trợ nhiều checkout cho submodule vẫn thử nghiệm — không khuyến khích dùng worktree với repo có submodule phức tạp
- Cùng branch: Một branch không thể check out trong hai worktree cùng lúc (trừ khi dùng
--force) - IDE support: Một số IDE chưa hỗ trợ tốt worktree — cần mở từng worktree như một project riêng
- Node modules / build artifacts: Không được chia sẻ — mỗi worktree cần
npm installriêng. Có thể dùng symlink hoặc volume mount để chia sẻ nếu cần - Bare repository: Không tạo được worktree từ bare repo trừ khi chỉ định commit/branch cụ thể
Tài liệu chính thức đầy đủ tại git-scm.com/docs/git-worktree. Khi đã quen, Git Worktree trở thành một trong những công cụ tăng năng suất cao nhất trong toolkit của developer — biến bài toán “làm nhiều việc cùng lúc” từ phiền toái trở nên trơn tru.
