Chuyển đến nội dung chính

Hướng dẫn Git Worktree: Làm việc trên nhiều nhánh mà không cần chuyển đổi

Hướng dẫn thực hành về Git worktree giúp bạn làm việc trên nhiều nhánh cùng lúc, tăng tốc review, và tránh phải stash hoặc chuyển ngữ cảnh.
Đã cập nhật 5 thg 6, 2026  · 9 phút đọc

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.

Sơ đồ kiến trúc kho - worktree chính với thư mục .git ở trung tâm, nhiều worktree liên kết trỏ về đó. Mũi tên thể hiện "các commit/nhánh/ref chia sẻ" so với "tệp làm việc độc lập" trong mỗi thư mục worktree

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.

HÌNH MINH HỌA: Sơ đồ hệ thống tệp cho thấy mối quan hệ giữa các worktree. Thư mục chính ml-pipeline/ chứa thư mục .git/ với thư mục con worktrees/. Worktree liên kết ml-pipeline-preprocessing/ chứa tệp .git (không phải thư mục) với mũi tên trỏ về .git/ chính. Cả hai thư mục đều có các tệp tương ứng (README.md, train.py) nhưng dùng chung cơ sở dữ liệu Git.

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

So sánh quy trình song song. Bên trái "Cách truyền thống": Hiển thị 7 bước tuần tự với mũi tên (stash → checkout → fix → push → checkout → unstash → phục hồi ngữ cảnh) mất 15+ phút. Bên phải "Với worktree": Hiển thị 3 khối song song (worktree chính tiếp tục làm, worktree hotfix được tạo/sửa/xóa) mất 2 phút, với các lệnh cd đơn giản.

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

Lưu đồ vòng đời worktree - Tạo → Làm việc → Commit → Xóa/Prune, với các điểm quyết định: "Xong việc chưa?", "Trạng thái sạch?", "Xóa thủ công?"

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.


Bex Tuychiev's photo
Author
Bex Tuychiev
LinkedIn

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. 

Chủ đề

Các khóa học Git hàng đầu

Courses

Giới thiệu về Git

2 giờ
78.3K
Khám phá các nguyên tắc cơ bản của Git trong việc kiểm soát phiên bản cho các dự án phần mềm và dữ liệu của quý vị.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow