
Git worktree là tính năng ít người biết nhưng cực kỳ mạnh: cho phép checkout nhiều branch ra nhiều thư mục riêng biệt, đồng thời, mà không cần git stash hay git checkout liên tục.
Thay vì hoán đổi working directory, bạn mở song song tất cả branch đang làm việc trên cùng lúc. Tính năng này ra đời từ Git 2.5 (2015) nhưng ít được đề cập trong documentation chính thức. Đa số developer chỉ biết stash, checkout, branch thông thường — worktree là level tiếp theo quản lý multi-context.
Cơ chế worktree hoạt động
Mỗi worktree là một thư mục mới (linked working tree) tham chiếu đến cùng một .git directory. Trong thư mục gốc, .git là file chứa gitdir: /path/to/main/.git/worktrees/feature. Các worktree con chia sử objects, refs, config — tiết kiệm disk space và không duplicate repository.
Git lưu metadata mỗi worktree tại .git/worktrees// với HEAD, index, config, logs riêng. Objects chung (commits, blobs, trees) lưu tại .git/objects — không duplicate. Khi bạn chạy git status bên trong worktree, Git đọc .git/worktrees/feature/index và diff với .git/objects. Cơ chế này cho phép multiple checkout cùng branch mà không xung đột.

So sánh worktree vs stash vs branch thông thường
| Tiêu chí | git stash | branch checkout | git worktree |
|---|---|---|---|
| Chuyển nhanh context | Có, nhưng xáo trộn stack | Cần checkout | Thư mục riêng, không xáo |
| Chạy song song | Không | Không | Có — mỗi branch 1 folder |
| Build/test riêng | Không | Cần clean workspace | Có — mỗi thư mục tách |
| Disk usage | Chung | Chung | Chung (shared objects) |
| Git metadata | Không rõ ràng | Làm rõ ràng | Rõ ràng, liệt kê git worktree list |
Cơ chế triển khai chi tiết
- Thư mục gốc giữ
.gitnhư file text trỏ đến.git/worktrees/. Đây là design choice: thư mục gốc vẫn là “main” worktree. - Mỗi worktree con chứa
.gitthật (là directory) vớiHEAD,index,configriêng. Khi bạncdvào worktree, Git tự detect qua gitdir file. - Shared objects nằm tại
.git/objects→ không duplicate ~500MB repo. Chỉ.git/worktrees/feature/tạo thêm ~10KB metadata mỗi worktree. - Refs tách:
.git/worktrees/feature/refs/heads/featuređộc lập. Có thể cùng lúc córefs/heads/mainở gốc vàrefs/heads/developở worktree, hoặc ngược lại.

Commands thông dụng
git worktree add ../feature-x feature-x # tạo worktree ở thư mục cha
git worktree list # liệt kê tất cả active
git worktree remove ../feature-x # xóa khi xong
git worktree prune # cleanup orphan
git worktree add -b hotfix-2024.01 ../hotfix main # branch mới từ main
Flag -b tạo branch mới trong worktree. Flag -f force overwrite nếu thư mục đã có. prune dọn dẹp các worktree entry không còn tồn tại trên disk (sau khi xóa thư mục thủ công).
Pattern thực tế
Khi cần hotfix production và vẫn tiếp tục develop:
git worktree add ../hotfix-2024.01 release/2024.01
cd ../hotfix-2024.01 && git cherry-pick abc123 && ./deploy.sh
cd ../main && git merge hotfix-2024.01
git worktree remove ../hotfix-2024.01
Pattern khác: maintain feature branch song song với release branch:
git worktree add ../release-2.0 release/2.0
git worktree add ../feature-auth feature/add-auth
# Build/test song song trong hai terminal
cd ../release-2.0 && make test
cd ../feature-auth && npm run test

Giới hạn và lưu ý
- Branch lock: Không mở worktree cùng branch trên 2 thư mục —
fatal: 'main' is already checked out at '/path/to/main'. Dùng flag--forcenếu cần. - Branch delete: Cần xóa worktree trước khi xóa branch liên kết hoặc báo lỗi
branch is used by worktree at '...'. Dùnggit worktree removetrước. - Submodule: Git submodule bên trong worktree cần init riêng — không tự inherit từ main worktree. Chạy
git submodule update --init --recursive. - CI/CD: Pipeline chưa auto-detect worktree; cần script
git -C /path/worktree status --porcelainđể check clean status. - Git hooks: Shared với main repo tại
.git/hooks/. Mỗi worktree dùng chung hooks — nếu cần custom hook/worktree, dùngcore.hooksPathtrong worktree config.
Khi nào dùng
- Maintain nhiều release branches song song (support 2024.01 + develop v2).
- Review PR lớn: checkout ở worktree riêng, giữ main workspace sạch cho hot work.
- Test patch hotfix trong khi feature branch đang chạy long-running build.
- Pair programming: mỗi dev một worktree, push/pull song song không conflict.
- Run multiple instance của service với config khác nhau cùng lúc.
Kết luận
Git worktree giải quyết pain point “chuyển context branch liên tục” bằng cách cung cấp môi trường tách biệt cho từng branch. Tiết kiệm thời gian stash/pop, tránh merge conflict ngoài ý muốn, và giúp parallelize công việc trên nhiều version cùng lúc. Tool đơn giản nhưng productivity multiplier cho team maintain nhiều release hoặc developer làm việc multi-context.
Đối với iOS dev như bạn, worktree hữu ích khi maintain nhiều version app (production v1.x, staging v2.x beta) cùng lúc — mỗi version cần Xcode build, Fastlane deploy riêng. Thay vì checkout liên tục, mở 2 worktree, 2 terminal, 2 simulator instance.
Nguồn tham khảo:
