
Quản lý đa nhánh hiệu quả với Git worktrees: Tăng tốc phát triển mà không cần clone nhiều lần
Là một nhà phát triển, bạn thường xuyên phải jongle giữa nhiều nhánh khác nhau: một nhánh đang phát triển tính năng mới, một nhánh để sửa lỗiCritical, và có thể còn một nhánh khác để chuẩn bị bản phát hành. Cách làm truyền thống là clone repository nhiều lần, dùng git stash để tạm lưu thay đổi, hoặc thường xuyên git checkout chuyển đổi nhánh. Tuy nhiên, tất cả các phương pháp này đều có nhược điểm rõ rệt: lãng phí không gian đĩa, tốn thời gian để chuyển đổi, và rủi ro làm mất công việc khi stash không được áp dụng đúng.
May mắn thay, Git có một giải pháp mạnh mẽ nhưng thường được bỏ qua: git worktree. Tính năng này cho phép bạn giữ nhiều working tree (cây làm việc) kết nối với cùng một repository, cho phép làm việc trên nhiều nhánh khác nhau cùng một lúc mà không cần sao chép toàn bộ mã nguồn.
Git worktree là gì?
Một worktree trong Git là một working tree kết nối với repository nhưng được lưu trữ ở một vị trí khác trên hệ thống tệp. Mỗi worktree có:
- Một working tree riêng (các tệp nguồn bạn đang chỉnh sửa)
- Một staging area riêng
- Một HEAD riêng (trỏ tới nhánh hoặc commit cụ thể)
Repository của bạn sẽ có:
- Main worktree: là working tree gốc được tạo khi bạn clone repository lần đầu tiên
- Linked worktrees: là các worktree bổ sung được tạo bằng lệnh
git worktree add
Quan trọng: tất cả các worktree chia sẻ cùng một Git directory (.git/), nghĩa là chúng cùng sử dụng cùng một cơ sở dữ liệu đối tượng (commits, blobs, trees, refs). Đây là lý do tại sao việc tạo worktree mới rất nhanh và tiết kiệm không gian so với việc clone một repository mới.
Cách sử dụng git worktree
Tạo worktree mới
Cú pháp cơ bản:
git worktree add []
Ví dụ:
git worktree add ../hotfix: Tạo một worktree mới tại thư mục../hotfix, tự động tạo và checkout nhánh mới có tênhotfix(được lấy từ tên thư mục)git worktree add ../feature/new-ui feature/new-ui: Tạo worktree tại../feature/new-uivà checkout nhánhfeature/new-uiđã tồn tạigit worktree add -d ../test: Tạo một worktree ở../testvới trạng thái detached HEAD (thử nghiệm mà không ảnh hưởng đến bất kỳ nhánh nào)
Liệt kê các worktree
Để xem tất cả worktree đang tồn tại:
git worktree list
Output ví dụ:
/path/to/main-repo a1b2c3d [main]
/path/to/../hotfix e4f5g6h [hotfix]
/path/to/../feature i7j8k9l [feature/new-ui]
Thêm tùy chọn -v để xem thông tin chi tiết hơn về mỗi worktree.
Các thao tác khác
- Khóa worktree (để ngăn ngây xóa không intentionally):
git worktree lock --reason - Di chuyển worktree:
git worktree move - Dọn dẹp worktree (xóa các worktree trỏ tới thư mục không còn tồn tại):
git worktree prune [--expire - Xóa worktree:
git worktree remove [--force]
Ví dụ thực tế: Quy trình phát triển với worktrees
Giả sử bạn đang làm việc trên một ứng dụng web và có đồng thời thực hiện các nhiệm vụ sau:
- Phát triển tính năng thanh toán mới (nhánh
feature/payment-gateway) - Chờ review pull request về sửa lỗi đăng nhập (nhánh
fix/login-bug) - Chuẩn bị bản phát hành phiên bản 2.1 (nhánh
release/v2.1)
Thay vì phải stash continuamente hoặc checkout liên tục, bạn có thể:
# Trong thư mục repository chính (main worktree trên nhánh entwickeln)
git worktree add ../feature-payment feature/payment-gateway
git worktree add ../login-fix fix/login-bug
git worktree add ../release-v2.1 release/v2.1
Bây giờ bạn có 4 thư mục làm việc:
.(thư mục gốc) - làm việc trên nhánhentwickeln../feature-payment- làm việc trên tính năng thanh toán mới../login-fix- sửa lỗi đăng nhập (có thể chạy test,review code)../release-v2.1- chuẩn bị bản phát hành (chèn changelog, build, etc.)
Trong mỗi thư mục, bạn có thể thực hiện các thao tác Git bình thường (commit, push, pull) mà không ảnh hưởng tới các worktree khác. Khi hoàn thành tính năng hoặc sửa lỗi, bạn chỉ cần push từ worktree đó và xóa nó đi:
# Sau khi hoàn thành tính năng thanh toán
cd ../feature-payment
git push origin feature/payment-gateway
cd ..
git worktree remove --force feature-payment
Lưu ý và best practices
- Các file không được chia sẻ: Mặc dù các worktree chia sẻ Git database, nhưng các file như
.gitignore,.gitattributes vẫn được đọc từ working tree của mỗi worktree. Điều này cho phép mỗi worktree có cấu hình riêng nếu cần. - Branch names: Tránh tạo worktree trên cùng một nhánh ở nhiều nơi cùng một lúc (trừ khi bạn biết mình đang làm gì), vì điều này có thể dẫn tới xung đột khi push.
- Các submodule: Các submodule được cập nhật độc lập trong mỗi worktree. Bạn cần chạy
git submodule update trong mỗi worktree nếu cần. - IDE và trình biên soạn: Hầu hết các IDE hiện đại (VS Code, IntelliJ, Sublime) tự động phát hiện khi bạn mở thư mục làm việc của một worktree và cấu hình môi trường phát triển tương ứng.
- CI/CD: Khi sử dụng worktrees trong môi trường CI, đảm bảo rằng mỗi job chỉ làm việc trong một worktree cụ thể để tránh xung đột.
Khi nào nên dùng worktree thay vì các giải pháp khác?
| Tình huống | Giải pháp đề xuất | Lý do |
|---|---|---|
| Cần làm việc trên nhiều nhánh cùng một lúc | Git worktree | Tiết kiệm không gian, chuyển đổi ngay lập tức, giữ nguyên trạng thái làm việc |
| Cần tạm dừng công việc hiện tại để xử lýเรื่อง urgent | Git worktree hoặc git stash | Worktree tốt hơn nếu bạn cần giữ cả hai trạng thái làm việc; stash tốt hơn nếu chỉ cần tạm lưu vài thay đổi nhỏ |
| Làm việc trên các thành phần độc lập fortemente coupled | Git submodule | Khi bạn muốn quản lý versions của các thành phần độc lập |
| Chia sẻ code giữa các project không liên quan | Sao chép hoặc dependency manager | Worktree chỉ 효과적 khi làm việc với cùng một repository |
Tích hợp với công cụ phát triển
Nhiều công cụ phát triển phổ biến đã có hỗ trợ tốt cho Git worktrees:
- VS Code: Khi bạn mở thư mục của một worktree, VS Code sẽ tự động nhận ra đó là một repository Git và cung cấp đầy đủ tính năng Version Control
- JetBrains IDEs (IntelliJ, PyCharm, etc.): Hỗ trợ đưa cửa sổ dự án tới một worktree và xử lý Git như bình thường
- Terminal multiplexers (tmux, screen): Dễ dàng tạo các pane/tab riêng cho mỗi worktree
- Git GUI clients (GitKraken, Sourcetree, GitHub Desktop): Hầu hết đều hỗ trợ tạo và quản lý worktree qua giao diện đồ họa
Kết luận
Git worktree là một công cụ mạnh mẽ giúp nhà phát triển quản lý nhiều nhánh Git một cách hiệu quả mà không cần chịu những gánh nặng của việc clone repository nhiều lần hoặc stash liên tục. Bằng cách cho phép nhiều working tree kết nối với cùng một Git directory, worktree:
- Tiết kiệm không gian đĩa đáng kể (chỉ cần thêm dung lượng cho working tree, không phải cho toàn bộ .git/objects)
- Cho phép chuyển đổi giữa các nhiệm vụ trong giây lát mà không cần commit/stash
- Giảm nguy cơ lỗi khi làm việc trên nhiều nhánh
- Tích hợp tốt với quy trình làm việc phát triển hiện đại
Nếu bạn thường xuyên thấy mình phải chạy git stash hoặc git checkout nhiều lần trong ngày, hãy thử sử dụng git worktree add. Bạn sẽ ngạc nhiên về mình đã bỏ qua công cụ hữu ích này đến متى.



