Đa nhiệm siêu tốc với git worktree: Làm nhiều Feature cùng lúc không cần stash hay clone mới
Hướng dẫn git worktree từ cơ bản đến thực tế: tạo nhiều working tree, làm feature và hotfix song song, review PR, quản lý list/remove/prune/lock/repair và tránh lỗi phổ biến.
ShanverseUpdated 10 min read— viewsLoading views
Git
Developer Tools
Bạn đang làm feature/checkout, nhưng production cần hotfix gấp. Cách quen thuộc là commit tạm, stash rồi chuyển branch, hoặc clone thêm toàn bộ repository. Với worktree, bạn giữ nguyên cửa sổ feature hiện tại và mở một thư mục khác cho hotfix.
Mỗi thư mục có thể mở trong IDE và chạy test độc lập.
git worktree hoạt động như thế nào?
Một repository chính có thể liên kết nhiều working tree:
Mermaid
Loading diagram…
Mỗi worktree có:
Working Tree riêng.
Index/Staging Area riêng.
Comments
HEAD riêng.
File untracked và dependency cài đặt trong thư mục riêng.
Các worktree dùng chung:
Commit objects.
Branch và tag refs.
Remote configuration.
Phần lớn repository-level Git configuration.
Lịch sử và object đã fetch.
Do đó, fetch ở một worktree làm object/ref remote mới xuất hiện cho các worktree khác. Nhưng file đang sửa và staging không lẫn nhau.
Worktree vs stash vs clone
Bắt đầu trong 60 giây
Giả sử thư mục hiện tại là project và bạn đang ở feature dở dang.
1. Kiểm tra worktree hiện có
2. Fetch branch mới nhất
3. Tạo hotfix worktree từ origin/main
Cú pháp:
4. Làm việc trong thư mục mới
Trong khi đó, project/ vẫn giữ nguyên feature, file chưa commit và editor state.
5. Xóa worktree sau khi hoàn tất
Nếu branch đã merge và không còn cần:
Tạo worktree với branch mới
Tạo feature từ main local:
Hoặc trực tiếp từ remote tracking branch:
Kiểm tra:
git -C <path> chạy Git command tại thư mục khác mà không cần cd.
Tạo worktree cho branch đã tồn tại
Nếu branch local tồn tại và chưa được checkout ở worktree khác:
Nếu chỉ có remote branch:
Một số trường hợp Git có thể tự suy luận remote tracking branch, nhưng khai báo rõ giúp command dễ hiểu và ít bất ngờ.
Một branch không nên được checkout ở hai worktree
Git mặc định chặn cùng một branch được checkout đồng thời ở nhiều worktree:
Lý do: cả hai thư mục sẽ cùng di chuyển một branch ref, dễ tạo trạng thái khó hiểu và mất thay đổi.
Giải pháp:
Dùng branch khác.
Dùng detached HEAD cho đọc/test.
Xóa worktree cũ nếu không còn dùng.
Không lạm dụng --force để vượt bảo vệ.
Tìm path đang giữ branch trước khi xử lý.
Review Pull Request bằng detached worktree
Khi chỉ muốn đọc code và chạy test mà không tạo branch lâu dài:
Hoặc theo commit:
Trong thư mục review:
Nếu bắt đầu sửa code và muốn giữ commit, tạo branch trước:
Đừng tạo commit quan trọng trên detached HEAD rồi xóa worktree mà chưa tạo branch/tag.
Hotfix production mà không gián đoạn feature
Trạng thái ban đầu
Tạo worktree hotfix
Sửa, test, commit và push
Quay lại feature
Không cần stash pop; mọi file feature vẫn ở đúng chỗ.
Chạy nhiều môi trường song song
Bạn có thể mở:
Nhưng ứng dụng có thể xung đột tài nguyên:
Cùng port.
Cùng database/schema.
Cùng container name.
Cùng cache/temp path.
Cùng environment file.
Dùng cấu hình riêng cho từng worktree:
Đảm bảo .env.local nằm trong .gitignore và không copy secret không cần thiết.
Dependency và build output
Mỗi worktree là thư mục riêng nên thường có:
node_modules riêng.
dist/build riêng.
Virtual environment riêng.
IDE index riêng.
Điều này tránh build artifact của branch này làm nhiễu branch khác, nhưng tốn disk hơn.
Tối ưu:
Dùng cache của package manager.
Dùng pnpm store dùng chung.
Không symlink node_modules giữa branch có dependency khác nhau.
Xóa worktree cũ khi hoàn tất.
Liệt kê và kiểm tra worktree
Ví dụ:
Dạng machine-readable:
Kiểm tra trạng thái từng thư mục:
Xóa worktree đúng cách
Trước tiên kiểm tra trạng thái:
Xóa:
Git sẽ từ chối nếu worktree có thay đổi hoặc file untracked có nguy cơ mất.
Chỉ force khi đã xác minh/backup:
Sau đó xóa branch nếu phù hợp:
worktree remove không tự động xóa branch vì branch có thể vẫn cần cho remote/PR.
Nếu thư mục worktree bị xóa thủ công
Xem metadata stale:
Xem trước prune:
Dọn metadata:
Chỉ prune worktree thực sự không còn tồn tại hoặc không cần giữ.
lock: Bảo vệ worktree tạm thời không truy cập được
Nếu worktree nằm trên ổ rời hoặc network mount, Git có thể nghĩ path đã mất và prune metadata. Lock nó:
Mở khóa:
repair: Sửa liên kết sau khi di chuyển repository
Nếu main repository hoặc linked worktree bị di chuyển thủ công, link có thể sai.
Từ repository/worktree còn truy cập được:
Hoặc truyền path cần repair:
Ưu tiên git worktree move khi muốn di chuyển worktree được hỗ trợ:
Kiểm tra git worktree list sau mọi thao tác.
Dùng worktree cho git bisect
Tạo môi trường điều tra riêng:
Feature worktree chính không bị checkout qua hàng loạt commit.
Kết thúc:
Dùng worktree cho documentation hoặc release
Documentation branch
Release branch
Kiểm tra tag cũ
Git config theo từng worktree
Phần lớn config dùng chung. Khi cần config riêng cho từng worktree, Git hỗ trợ worktree config sau khi bật extension:
Trong worktree cần cấu hình:
Đây là tính năng nâng cao. Ghi tài liệu rõ để team không nhầm config local/repository/worktree.
Không dùng Git config để lưu secret dạng plaintext; dùng secret manager hoặc file ignored phù hợp.
Các giới hạn cần hiểu
Worktrees dùng chung repository objects và refs, không độc lập như clone.
Cùng branch thường không thể checkout ở hai worktree.
Xóa main repository có thể làm linked worktrees hỏng.
Fetch/prune refs ảnh hưởng góc nhìn chung của repository.
Hook và config repository có thể dùng chung tùy setup.
Mỗi worktree vẫn cần dependency/build output riêng.
Backup, credential và remote vẫn cần quản lý ở cấp repository.
Quy ước đặt tên thư mục
Giữ tên dễ nhận biết:
Hoặc gom vào thư mục:
Tránh tạo linked worktree bên trong thư mục tracked của repository chính vì dễ vô tình add cả worktree vào Git.
Sai lầm thường gặp
Xóa thư mục bằng file manager
Metadata Git còn sót. Dùng git worktree remove.
Quên commit nằm trên detached HEAD
Tạo branch trước khi xóa:
Force add cùng branch ở hai nơi
Điều này phá cơ chế bảo vệ và gây branch state khó hiểu. Dùng branch riêng.
Dùng chung port/database
Hai app ghi cùng resource có thể làm test sai hoặc hỏng dữ liệu. Tách cấu hình runtime.
Cho rằng worktree là backup
Mọi worktree dùng chung object database. Vẫn cần remote/backup đúng chuẩn.
Để quá nhiều worktree không dùng
Dependency và build cache tiêu tốn disk; branch cũ làm danh sách khó quản lý. Review định kỳ:
Checklist làm việc song song
Đã fetch refs mới nhất.
Mỗi công việc có branch riêng.
Path worktree nằm ngoài repository tracked.
Port, database và env được tách.
Dependency được cài riêng hoặc cache an toàn.
Không bypass cảnh báo branch đã checkout.
Detached worktree được tạo branch nếu có commit cần giữ.
Kiểm tra git status trước remove.
Dùng git worktree remove, không rm -rf.
Xóa branch chỉ sau khi merge/backup.
Lock worktree trên ổ rời.
Worktree cũ được prune định kỳ.
Cheat sheet
Tổng kết
Quy trình worktree hiệu quả:
Fetch và chọn base đúng.
Tạo branch + thư mục bằng git worktree add.
Tách dependency, port, database và env.
Commit/push như một working tree bình thường.
Kiểm tra status rồi git worktree remove.
Xóa branch đã merge và prune metadata stale.
Table of contents(42)
Codeplain text
1project/ → feature/checkout2project-hotfix/ → hotfix/payment-timeout3project-review/ → review một commit/branch khác
Codeplain text
1fatal: 'feature/payment' is already checked out at '...'
Hướng dẫn Git Aliases và .gitconfig thực chiến: alias an toàn, log đẹp, cấu hình pull/push/rebase, includeIf cho tài khoản work/personal, bảo mật và chia sẻ dotfiles.
Phân tích Gitflow vs GitHub Flow vs Trunk-Based Development: cấu trúc branch, ưu nhược điểm, điều kiện áp dụng, ma trận quyết định và lộ trình chuyển đổi cho từng loại dự án.