Courses
Bạn đang làm việc trên một nhánh tính năng thì đồng đội nhờ bạn review pull request. Bạn có thể stash thay đổi, chuyển nhánh và hy vọng nhớ được mình dở dang đến đâu. Hoặc bạn có thể commit phần công việc đang làm dở chỉ để khỏi mất. Rồi đến tình huống hotfix khẩn cấp: hệ thống production sập, trong khi bạn đang ở giữa một đợt refactor chạm đến nửa codebase. Mỗi lần chuyển ngữ cảnh như vậy tốn 10–15 phút thiết lập và làm gián đoạn sự tập trung của bạn.
Git worktree giải quyết điều này bằng cách cho phép bạn checkout nhiều nhánh cùng lúc ở các thư mục riêng biệt. Thay vì stash hoặc commit công việc chưa hoàn thiện, bạn chỉ cần cd sang một thư mục khác nơi một nhánh khác đã được checkout sẵn. Làm việc trên hotfix, triển khai nó, rồi cd quay lại công việc tính năng đúng như lúc bạn rời đi.
Trong hướng dẫn này, tôi sẽ chỉ bạn cách tạo và quản lý worktree, tránh các lỗi thường gặp, và tích hợp chúng vào quy trình làm việc hằng ngày. Bạn nên đã hiểu về nhánh, commit trong Git, và các thao tác dòng lệnh cơ bản. Nếu cần ôn lại các kiến thức nền tảng của Git trước, tôi khuyên bạn xem khóa Introduction to Git của DataCamp để nắm vững những điều cốt yếu.
Git Worktree là gì?
Git worktree là tính năng tích hợp sẵn cho phép tạo thêm các thư mục làm việc liên kết với cùng một kho. Thư mục làm việc chính của bạn là primary worktree, và mỗi worktree bổ sung sẽ có thư mục riêng với nhánh riêng được checkout. Tất cả các worktree này kết nối đến cùng một kho .git.

Kiến trúc kho dùng chung này có nghĩa là các commit bạn thực hiện ở bất kỳ worktree nào sẽ xuất hiện ngay trong cơ sở dữ liệu Git dùng chung, và có thể truy cập từ mọi worktree khác. Bản thân các tệp vẫn độc lập — việc chỉnh sửa train.py trong một worktree chỉ ảnh hưởng đến thư mục đó cho đến khi bạn commit thay đổi.
Vì sao không chỉ dùng nhiều terminal?
Bạn không thể mở nhiều terminal trong cùng một thư mục và làm việc trên các nhánh khác nhau đồng thời. Git chỉ cho phép một nhánh được checkout tại một thời điểm cho mỗi thư mục. Khi bạn chạy git checkout feature-b trong một terminal, nó thay đổi tệp cho mọi terminal trỏ đến thư mục đó.
Git worktree giải quyết điều này bằng cách cấp cho mỗi nhánh một thư mục riêng. Mỗi thư mục hoàn toàn độc lập với tệp, tiến trình đang chạy, và artifact build của riêng nó. Việc chuyển giữa các nhánh trở thành cd ../different-directory thay vì git checkout different-branch.
Điều kiện tiên quyết cho Git Worktree
Trước khi dùng git worktree, hãy xác minh thiết lập của bạn:
- Git 2.5 trở lên: Chạy
git --versionđể kiểm tra. Git worktree ra mắt năm 2015, nên hầu hết bản cài đặt đều có - Kho Git hiện có: Bạn sẽ cần một kho với ít nhất một nhánh
- Quen thuộc dòng lệnh: Mọi thao tác worktree diễn ra trong terminal
Kiểm tra worktree có sẵn hay không:
git worktree --help
Nếu hiện trang trợ giúp, bạn đã sẵn sàng.
Khi nào nên dùng git worktree
Git worktree hữu ích khi việc chuyển nhánh sẽ làm gián đoạn công việc hiện tại của bạn:
- Code review: Kiểm thử thay đổi của đồng đội mà không cần stash công việc tính năng
- Hotfix khẩn cấp: Sửa lỗi production trong khi phần refactor vẫn nguyên vẹn
- Phát triển song song: Làm hai tính năng độc lập mà không phải chuyển nhánh liên tục
- Tiến trình chạy lâu: Khởi chạy bộ test 30 phút và tiếp tục code trong worktree khác
Bỏ qua nếu đó là tác vụ nhanh dưới 10 phút nơi git checkout đơn giản hơn, hoặc khi bạn tập trung vào một đầu việc duy nhất và không có gián đoạn dự kiến.
Tạo Worktree đầu tiên của bạn
Cách tốt nhất để hiểu git worktree là tạo một cái và xem nó hoạt động. Chúng ta sẽ đi qua các lệnh cơ bản, khám phá cấu trúc Git tạo ra, và quan sát cách thay đổi luân chuyển giữa các worktree.
Thiết lập kho mẫu
Trước khi đi sâu vào worktree, bạn cần một kho Git để thao tác. Nếu bạn đã có một dự án Python với nhiều nhánh, hãy chuyển đến phần tiếp theo. Nếu không, hãy nhanh chóng dựng một pipeline ML đơn giản:
mkdir ml-pipeline
cd ml-pipeline
git init
Tạo README và một script Python:
echo "# ML Pipeline" > README.md
echo "def load_data():" > train.py
echo " print('Loading training data...')" >> train.py
Xác minh các tệp đã được tạo:
ls
# You should see: README.md train.py
Commit các tệp này và tạo một nhánh tính năng:
git add .
git commit -m "Initial commit"
git branch feature-preprocessing
Giờ bạn có một kho với hai nhánh: main (nhánh hiện tại) và feature-preprocessing.
Tạo worktree cơ bản
Tạo một worktree cho nhánh đã có chỉ cần một lệnh. Hãy checkout feature-preprocessing trong một thư mục riêng:
git worktree add ../ml-pipeline-preprocessing feature-preprocessing
Lệnh này tạo một thư mục mới tên ml-pipeline-preprocessing ở cấp trên của vị trí hiện tại, checkout nhánh feature-preprocessing tại đó, và liên kết nó với kho hiện có.
Git xác nhận đã tạo:
Preparing worktree (checking out 'feature-preprocessing')
HEAD is now at 0a7f986 Initial commit
Với công việc hoàn toàn mới, hãy tạo cả nhánh và worktree cùng lúc:
git worktree add -b feature-visualization ../ml-pipeline-viz
Cờ -b tạo nhánh mới tên feature-visualization và checkout nó trong worktree mới.
Khám phá cấu trúc worktree
Với worktree đã được tạo, giờ bạn có nhiều thư mục trên hệ thống tệp. Để xem tất cả:
git worktree list
/Users/you/projects/ml-pipeline 0a7f986 [main]
/Users/you/projects/ml-pipeline-preprocessing 0a7f986 [feature-preprocessing]
Dòng đầu tiên hiển thị worktree chính — thư mục gốc ban đầu chứa thư mục .git. Dòng thứ hai hiển thị worktree liên kết. Cả hai đều hiển thị hash commit hiện tại và nhánh được checkout.

Mỗi thư mục worktree hoạt động như một kho Git hoàn chỉnh. Bạn có thể đi vào, chỉnh sửa tệp, chạy git status, và thực hiện commit. Các worktree liên kết không chứa toàn bộ thư mục .git—thay vào đó, chúng có một tệp .git trỏ về kho chính. Bên trong thư mục .git chính, một thư mục worktrees lưu metadata về từng worktree liên kết.
Làm việc trong một worktree
Đi đến worktree feature-preprocessing và tạo một commit:
cd ../ml-pipeline-preprocessing
cat >> train.py << 'EOF'
def preprocess_features(df):
"""Normalize numeric features."""
return (df - df.mean()) / df.std()
EOF
git add train.py
git commit -m "Add feature preprocessing function"
Commit diễn ra bình thường:
[feature-preprocessing 7c8d4e2] Add feature preprocessing function
1 file changed, 3 insertions(+)
Quay lại worktree chính và kiểm tra lịch sử commit:
cd ../ml-pipeline
git log --oneline --all
Commit mới của bạn xuất hiện:
7c8d4e2 Add feature preprocessing function
0a7f986 Initial commit
Lưu ý cách commit xuất hiện ngay lập tức ở cả hai vị trí mà không cần lệnh bổ sung nào.
Các tình huống sử dụng Git Worktree
Giờ bạn đã biết cách tạo và làm việc trong worktree, hãy xem các kịch bản thực tế nơi chúng giải quyết các vấn đề phát triển phổ biến.
Quy trình code review
Đồng đội cần phản hồi cho PR của họ. Thay vì stash thay đổi và chuyển nhánh, hãy tạo một thư mục riêng để review:
git worktree add ../ml-pipeline-review pr/update-training
cd ../ml-pipeline-review
pip install -r requirements.txt
python train_model.py --config experiments/baseline.yaml
Kiểm thử thay đổi và để lại phản hồi. Khi xong:
cd ../ml-pipeline
git worktree remove ../ml-pipeline-review
Công việc ban đầu của bạn vẫn nguyên vẹn. Không cần stash hay chuyển ngữ cảnh. Để biết thêm chiến lược về code review hiệu quả, hãy xem hướng dẫn best practices về code review của DataCamp.
Hotfix khẩn cấp
Nếu không có worktree:
- Lưu thay đổi refactor của bạn ở đâu đó (stash hoặc commit WIP)
- Checkout nhánh main
- Sửa lỗi
- Đẩy lên production
- Checkout nhánh tính năng
- Khôi phục thay đổi của bạn (unstash hoặc revert commit WIP)
- Gầy dựng lại ngữ cảnh tinh thần về việc bạn đang làm

Với worktree:
git worktree add ../ml-pipeline-hotfix main
cd ../ml-pipeline-hotfix
Sửa và triển khai:
git add src/data/validation.py
git commit -m "Fix schema validation for nullable timestamp fields"
git push origin main
cd ../ml-pipeline
git worktree remove ../ml-pipeline-hotfix
Bạn quay lại phần refactor chỉ trong vài giây, với mọi tệp đúng như lúc bạn rời đi.
Phát triển tính năng song song
Bạn đang triển khai custom metrics và một data loader mới — hai tính năng độc lập. Tạo một worktree cho mỗi phần:
git worktree add -b feature-custom-metrics ../ml-pipeline-metrics
git worktree add -b feature-streaming-loader ../ml-pipeline-loader
Hệ thống tệp của bạn giờ trông như sau:
~/projects/
ml-pipeline/ [main] - your usual work
ml-pipeline-metrics/ [feature-custom-metrics]
ml-pipeline-loader/ [feature-streaming-loader]
Chạy cả hai tính năng song song — mỗi cái trong một terminal riêng:
# Terminal 1
cd ~/projects/ml-pipeline-metrics
python experiments/evaluate_custom_metrics.py
# Terminal 2
cd ~/projects/ml-pipeline-loader
pytest tests/test_data_loader.py -v
Cả hai tiến trình chạy đồng thời mà không xung đột. Khi một tính năng hoàn tất, merge và xóa worktree:
cd ~/projects/ml-pipeline
git merge feature-custom-metrics
git worktree remove ../ml-pipeline-metrics
Quản lý và dọn dẹp Worktree

Liệt kê worktree
Để xem tất cả worktree trong một kho:
git worktree list
/Users/you/projects/ml-pipeline a3f9c81 [main]
/Users/you/projects/ml-pipeline-review b7d4e92 [pr/data-validation]
/Users/you/projects/ml-pipeline-hotfix a3f9c81 [hotfix/schema-bug]
Mỗi dòng hiển thị đường dẫn thư mục, hash commit hiện tại, và nhánh được checkout. Mục đầu tiên luôn là worktree chính (chứa thư mục .git), các mục còn lại là worktree liên kết.
Để script hoặc điều hướng nhanh, chỉ trích xuất đường dẫn:
git worktree list | awk '{print $1}'
Xóa worktree
Khi bạn hoàn tất công việc trong một worktree, hãy xóa đúng cách:
cd ~/projects/ml-pipeline
git worktree remove ../ml-pipeline-review
Git bảo vệ chống mất dữ liệu. Nếu bạn có thay đổi chưa commit:
git worktree remove ../ml-pipeline-review
fatal: '../ml-pipeline-review' contains modified or untracked files, use --force to delete it
Buộc xóa nếu bạn chắc chắn:
git worktree remove --force ../ml-pipeline-review
Nếu một worktree bị khóa, dùng --force hai lần:
git worktree remove --force --force ../ml-pipeline-locked
Nếu bạn đã xóa thủ công một thư mục worktree (rm -rf hoặc qua trình quản lý tệp), Git vẫn theo dõi nó nội bộ. Dọn tham chiếu cũ:
git worktree prune
Xem trước những gì sẽ bị prune:
git worktree prune --dry-run
Thực hành tốt và lỗi thường gặp
Hãy cùng xem một số cách để tận dụng worktree hiệu quả nhất và cách tránh các lỗi phổ biến.
Tổ chức worktree
Vị trí đặt worktree là quan trọng. Phần lớn developer đặt chúng cạnh kho chính:
~/projects/
ml-pipeline/ # main worktree
ml-pipeline-feature-auth/ # linked worktree
ml-pipeline-hotfix-login/ # linked worktree
Cấu trúc này giữ mọi thứ ở một nơi và giúp đường dẫn dễ đoán. Mẫu projectname-branchname cho bạn biết chính xác mỗi thư mục chứa gì.
Một số developer thích một thư mục chuyên dụng:
~/projects/
ml-pipeline/ # main worktree
ml-pipeline-worktrees/
feature-auth/
hotfix-login/
Hãy chọn một cách và dùng nhất quán. Tên mô tả như ml-pipeline-user-authentication giúp thư mục tự giải thích, còn tên chung chung như ml-pipeline-temp hay ml-pipeline-2 buộc bạn phải kiểm tra bên trong. Hãy coi worktree là tạm thời—tạo cho một tác vụ cụ thể, rồi xóa khi xong.
Lỗi thường gặp
Cùng một nhánh trong nhiều worktree
Git ngăn việc checkout cùng một nhánh trong hai worktree:
git worktree add ../ml-pipeline-duplicate main
fatal: 'main' is already used by worktree at '/Users/you/projects/ml-pipeline'
Cơ chế bảo vệ này tồn tại vì bạn có thể tạo các commit xung đột. Nếu cần cùng một mã ở hai nơi, hãy tạo nhánh mới.
Worktree bị quên và dung lượng đĩa
Mỗi worktree sẽ ở lại hệ thống tệp cho đến khi bạn xóa rõ ràng. Các worktree cũ tích tụ; dự án có thể dồn 15+ worktree bị quên, ngốn hàng gigabyte.
Mỗi worktree chứa một bản sao đầy đủ các tệp của kho. Một kho 500MB với 5 worktree sẽ chiếm 2.5GB. Hãy xóa worktree khi xong việc:
git worktree list
git worktree remove ../ml-pipeline-old-feature
Lồng nhau các worktree
Đừng tạo một worktree bên trong thư mục của worktree khác. Git cho phép điều này, nhưng nó gây cấu trúc thư mục rối rắm và khiến việc dọn dẹp dễ sai sót.
Tối ưu quy trình làm việc
Alias shell giúp tiết kiệm thời gian nếu bạn thường xuyên tạo worktree:
alias gwl='git worktree list'
alias gwa='git worktree add'
alias gwr='git worktree remove'
Với thiết lập phức tạp hơn, hãy viết một hàm tạo worktree và cấu hình môi trường phát triển chỉ với một bước:
wt() {
git worktree add "../${PWD##*/}-$1" -b "$1"
cd "../${PWD##*/}-$1"
python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt
}
Biến ${PWD##*/} trích xuất tên thư mục hiện tại. Chạy wt feature-logging từ ml-pipeline sẽ tạo ml-pipeline-feature-logging, chuyển vào đó, và thiết lập Python virtual environment cùng dependencies.
Việc tạo worktree trở thành một lệnh duy nhất:
wt feature-custom-metrics
Tùy biến theo ngôn ngữ của bạn: thay phần thiết lập Python bằng bundle install cho Ruby, cargo build cho Rust, hoặc npm install cho Node.js.
Trình soạn thảo hay IDE của bạn hoạt động với worktree mà không cần cấu hình đặc biệt. Mỗi worktree chỉ là một thư mục, vì vậy hãy mở nó như bất kỳ thư mục dự án nào khác. Hầu hết editor hiện đại hỗ trợ mở nhiều root dự án đồng thời — bạn có thể mở ba worktree trong một cửa sổ và chuyển qua lại trong sidebar.
Worktree nâng cao: Phát triển song song với hỗ trợ AI
Nếu bạn dùng trợ lý code AI, worktree mở khóa một quy trình song song mạnh mẽ. Cách tiếp cận này được nhiều developer và đội ngũ áp dụng trong giai đoạn 2024–2025.
Tạo các worktree riêng cho từng tác vụ:
git worktree add -b feature-add-logging ../ml-pipeline-logging
git worktree add -b feature-optimize-preprocessing ../ml-pipeline-optim
git worktree add -b bugfix-memory-leak ../ml-pipeline-bugfix
Mở một pane terminal cho mỗi worktree và khởi động trợ lý AI của bạn:
# Pane 1
cd ~/projects/ml-pipeline-logging
claude
# Pane 2
cd ~/projects/ml-pipeline-optim
claude
# Pane 3
cd ~/projects/ml-pipeline-bugfix
claude
Mỗi phiên AI làm việc trên một tính năng khác nhau mà không can nhiễu. Nhiều đội báo cáo hoàn thành công việc trong vài giờ thay vì vài ngày trước đây. Ví dụ, incident.io chạy 4–5 tác nhân Claude Code song song theo mô hình này. Có trường hợp Claude ước lượng cải tiến UI mất 2 giờ nhưng hoàn thành trong 10 phút.
Cân nhắc đánh đổi:
- Tiêu thụ token: Nhiều phiên AI dùng nhiều tín dụng API hơn và có thể chạm giới hạn tốc độ
- Chi phí thiết lập: Mỗi worktree cần môi trường ảo và dependency riêng
- Tải nhận thức: Quản lý nhiều cuộc trao đổi trên các tác vụ khác nhau
Cách này phù hợp với các tính năng lớn độc lập (mỗi cái 30+ phút) nơi công việc không động vào cùng tệp, và bạn có đủ quota API. Bỏ qua với các lỗi nhỏ, tính năng gắn kết chặt, hoặc khi sắp chạm giới hạn tốc độ API.
Kết luận
Hãy nhớ kịch bản ở đầu bài — đồng đội cần review PR khi bạn đang giữa một tính năng. Giờ bạn đã biết giải pháp: git worktree add ../ml-pipeline-review pr/branch-name, rồi cd để bắt đầu review. Công việc tính năng của bạn vẫn nguyên vẹn. Không stash, không commit nửa vời, không tốn công ghép lại ngữ cảnh khi quay về. Hai thư mục, hai nhánh, không ma sát.
Git worktree không làm phức tạp quy trình của bạn — nó đơn giản hóa. Mỗi worktree chỉ là một thư mục với một nhánh đã checkout. Nhưng sự đơn giản đó mở khóa một điều mạnh mẽ: khả năng chuyển ngữ cảnh tức thời giữa các tác vụ mà không chịu tải nhận thức từ việc stash, checkout, và xây dựng lại mô hình tinh thần.
Khi bạn cần tích hợp worktree với quy trình cộng tác nhóm như pull request và code review, lộ trình kỹ năng GitHub Foundations của DataCamp bao quát các thực hành thiết yếu để làm việc hiệu quả với đội ngũ phân tán.
Git Worktree FAQs
Tôi có thể dùng Git worktree với GitHub Desktop, VS Code, hoặc các công cụ GUI khác không?
Có. Worktree hiển thị với editor và các GUI Git như những thư mục dự án bình thường. Bạn có thể mở mỗi worktree như một dự án riêng, và hầu hết công cụ—bao gồm VS Code, IntelliJ, và GitHub Desktop—xử lý chúng mà không cần cấu hình đặc biệt.
Git worktree tương tác với remote như origin thế nào?
Tất cả worktree dùng chung thư mục .git, nên chúng chia sẻ cùng cấu hình remote và lịch sử fetch. Bạn không cần chạy git fetch trong mọi worktree—fetch ở một nơi sẽ cập nhật remote cho tất cả. Theo dõi nhánh hoạt động y hệt như trong thiết lập một worktree.
Điều gì xảy ra nếu tôi xóa thư mục worktree thủ công thay vì dùng git worktree remove?
Git vẫn nghĩ worktree tồn tại và đánh dấu là “có thể prune.” Bạn sẽ không làm hỏng kho, nhưng các lệnh Git có thể hiển thị cảnh báo. Chạy git worktree prune để dọn mục cũ và xóa metadata mồ côi một cách an toàn.
Git worktree có an toàn để dùng với monorepo lớn hoặc hệ thống build như Bazel, Pants, hay Nx không?
Có, nhưng artifact build có thể nhân lên nhanh chóng. Mỗi worktree có thư mục làm việc riêng, vì vậy cache, môi trường ảo, và output build sẽ bị nhân đôi. Với monorepo, thông thường cấu hình công cụ build để lưu cache bên ngoài worktree nhằm tránh dùng đĩa quá mức.
Tôi có thể dùng Git worktree với submodule hoặc sparse checkout không
Có. Submodule và sparse checkout hoạt động bình thường trong worktree, nhưng bạn cần khởi tạo hoặc cập nhật chúng riêng ở mỗi worktree vì nội dung thư mục làm việc không được chia sẻ. Dữ liệu Git nền tảng vẫn dùng chung, nhưng các tệp đã checkout là độc lập.
Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt nhàm chán. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, và đang ấp ủ thêm một khóa nữa. Nội dung của tôi đã tiếp cận hơn 5 triệu lượt xem, trong đó có 20 nghìn người trở thành người theo dõi trên cả Medium và LinkedIn.
