
Git worktree là tính năng ít được nhắc đến nhưng cực kỳ mạnh mẽ, cho phép bạn làm việc với nhiều nhánh Git cùng lúc trong các thư mục riêng biệt — mà không cần stash, không cần đóng dở linh tinh. Thay vì checkout qua lại giữa các nhánh, bạn có thể có 2-3 thư mục working tree khác nhau, mỗi thư mục đang ở một nhánh khác nhau, và chỉ cần mở thêm một terminal.
Tại sao cần worktree?
Tình huống quen thuộc: bạn đang code feature A, bỗng có bug production cần hotfix ngay trên main. Bình thường bạn phải git stash hoặc git commit dở, rồi checkout sang main, fix xong rồi lại checkout về feature/a. Với worktree, bạn chỉ cần thêm một thư mục mới trỏ sang main mà không ảnh hưởng gì đến thư mục hiện tại đang code feature/a.

Cú pháp cơ bản
# Thêm worktree mới cho nhánh existing
git worktree add /đường/dẫn/thư-mục-mới <tên-nhánh>
# Thêm worktree mới và tạo nhánh mới
git worktree add /đường/dẫn/thư-mục-mới -b <tên-nhánh-mới>
# Liệt kê tất cả worktree
git worktree list
# Xóa worktree
git worktree remove /đường/dẫn/thư-mục-mới
Ví dụ thực tế:
# Thư mục project gốc đang ở nhánh feature/login
cd ~/projects/myapp
git status # on branch feature/login
# Thêm worktree cho hotfix
git worktree add ~/projects/myapp-hotfix main
# Bây giờ bạn có 2 thư mục:
# ~/projects/myapp -> feature/login
# ~/projects/myapp-hotfix -> main
# Fix bug xong, commit ở thư mục hotfix
cd ~/projects/myapp-hotfix
git commit -am "hotfix: fix null pointer on user login"
# Merge xong, xóa worktree hotfix
cd ~/projects/myapp
git merge main
git worktree remove ~/projects/myapp-hotfix
Các kịch bản sử dụng thực tế
- Hotfix production: Giữ nguyên progress feature A, mở thêm thư mục
mainđể fix bug nhanh. - Code review + fix: Thư mục 1 xem PR của đồng nghiệp, thư mục 2 tiếp tục code feature.
- Multi-platform build: Một worktree chạy server, một chạy mobile app nếu repo monorepo.
- Testing: Kiểm tra tác động merge bằng cách checkout branch mục tiêu vào worktree mới mà không rời thư mục chính.

Best practices và lưu ý
- Không đổi tên/move thư mục worktree sau khi tạo — Git lưu trữ absolute path trong
.git/worktrees, move thư mục sẽ khiến Git mất track. - Mỗi worktree có thư mục
.gitriêng (thực chất là file text chứa đường dẫn thư mục gốc), nên tránh xóa thư mục gốc khi còn worktree phụ thuộc. - Worktree trên cùng commit hash — khi pull ở thư mục gốc, các worktree phụ vẫn ở commit cũ. Cần
git worktree list --porcelainkiểm tra. - Tên thư mục nên rõ ràng:
project-hotfix-20250821,project-feature-api-v2thay vìtmp. - Dọn dẹp định kỳ:
git worktree prunexóa các worktree bị mất (thư mục đã xóa nhưng Git vẫn ghi nhận).
So sánh worktree vs alternatives
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| git stash + checkout | Không cần disk thêm | Mất context, lỡ code chưa commit, lộn xộn khi hoán đổi nhiều |
| git clone repo mới | Cách thủ công dễ hiểu | Clone lại 500MB mỗi lần, thêm remote phức tạp, disk lãng phí |
| git worktree | Nhanh, shared object DB, không cần stash, context riêng biệt | Không di chuyển được thư mục sau khi tạo, tốn disk cho large build |
| IDE multi-branch window | Giao diện trực quan | Phụ thuộc IDE, không có terminal riêng, khó quản lý nhiều concurrent |

Kết luận
Git worktree là công cụ tối ưu cho developer nào thường xuyên phải nhảy giữa nhiều nhánh cùng lúc — đặc biệt khi làm việc với hotfix, code review, hoặc monorepo. Bạn chỉ cần dùng 2-3 lệnh cơ bản git worktree add và git worktree remove mà không cần patch thêm tool hay plugin. Tiết kiệm thời gian checkout, không còn stash rồi quên apply, và quan trọng nhất: không bao giờ đánh mất context của feature đang code dở.
