Git Worktree: Làm việc nhiều branch cùng lúc không cần stash

Git Worktree là gì?

Git Worktree — nhiều working tree chia sẻ chung một repository, giúp làm việc song song trên nhiều branch
Git Worktree — nhiều working tree chia sẻ chung một repository, giúp làm việc song song trên nhiều branch

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ở

Developer đang sử dụng Git Worktree để tạo branch hotfix song song với feature đang phát triển
Developer đang sử dụng Git Worktree để tạo branch hotfix song song với feature đang phát triển

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-afeature-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 ý

  1. Đặt worktree ngoài thư mục repo gốc: Dùng ../feature-name hoặc ~/worktrees/feature-name — tránh nested worktree gây khó quản lý
  2. Luôn dùng git worktree remove: Xóa thư mục thủ công để lại file admin trong .git/worktrees/ — dùng prune nếu đã xóa tay
  3. 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
  4. Bật config riêng cho worktree: git config extensions.worktreeConfig true cho phép mỗi worktree có .git/config.worktree riêng (ví dụ user.name khác nhau)
  5. 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 install riê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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Astro Framework: Xây Dựng Web Hiệu Suất Cao Với Kiến Trúc Islands

Astro Framework là một framework JavaScript hiện đại được thiết kế để xây dựng các trang web nhanh hơn, nhẹ hơn bằng kiến trúc Islands Architecture. Thay vì tải toàn…

Xem thêm

Zig: Ngôn ngữ lập trình hệ thống thay thế C với an toàn và hiệu suất

Zig: Ngôn ngữ lập trình hệ thống thay thế C với an toàn và hiệu suất Zig đang nổi lên như một ngôn ngữ lập trình hệ thống hiện đại,…

Xem thêm

Effect-TS: Xử lý lỗi kiểu an toàn và quản lý phụ thuộc trong TypeScript

Effect-TS là framework TypeScript mã nguồn mở giúp xử lý lỗi kiểu an toàn (type-safe) và quản lý phụ thuộc (dependency injection) một cách rõ ràng. Khác với try-catch truyền…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất