Git Worktrees: Quản lý nhiều nhánh song song hiệu quả

Git worktree là tính năng ít người biết nhưng cực kỳ mạnh: cho phép checkout nhiều branch ra nhiều thư mục riêng biệt, đồng thời, mà không cần git stash hay git checkout liên tục.

Thay vì hoán đổi working directory, bạn mở song song tất cả branch đang làm việc trên cùng lúc. Tính năng này ra đời từ Git 2.5 (2015) nhưng ít được đề cập trong documentation chính thức. Đa số developer chỉ biết stash, checkout, branch thông thường — worktree là level tiếp theo quản lý multi-context.

Cơ chế worktree hoạt động

Mỗi worktree là một thư mục mới (linked working tree) tham chiếu đến cùng một .git directory. Trong thư mục gốc, .git là file chứa gitdir: /path/to/main/.git/worktrees/feature. Các worktree con chia sử objects, refs, config — tiết kiệm disk space và không duplicate repository.

Git lưu metadata mỗi worktree tại .git/worktrees// với HEAD, index, config, logs riêng. Objects chung (commits, blobs, trees) lưu tại .git/objects — không duplicate. Khi bạn chạy git status bên trong worktree, Git đọc .git/worktrees/feature/index và diff với .git/objects. Cơ chế này cho phép multiple checkout cùng branch mà không xung đột.

Biểu đồ thao tác Git (commit, branch, merge)
Biểu đồ thao tác Git (commit, branch, merge)

So sánh worktree vs stash vs branch thông thường

Tiêu chí git stash branch checkout git worktree
Chuyển nhanh context Có, nhưng xáo trộn stack Cần checkout Thư mục riêng, không xáo
Chạy song song Không Không Có — mỗi branch 1 folder
Build/test riêng Không Cần clean workspace Có — mỗi thư mục tách
Disk usage Chung Chung Chung (shared objects)
Git metadata Không rõ ràng Làm rõ ràng Rõ ràng, liệt kê git worktree list

Cơ chế triển khai chi tiết

  • Thư mục gốc giữ .git như file text trỏ đến .git/worktrees/. Đây là design choice: thư mục gốc vẫn là “main” worktree.
  • Mỗi worktree con chứa .git thật (là directory) với HEAD, index, config riêng. Khi bạn cd vào worktree, Git tự detect qua gitdir file.
  • Shared objects nằm tại .git/objects → không duplicate ~500MB repo. Chỉ .git/worktrees/feature/ tạo thêm ~10KB metadata mỗi worktree.
  • Refs tách: .git/worktrees/feature/refs/heads/feature độc lập. Có thể cùng lúc có refs/heads/main ở gốc và refs/heads/develop ở worktree, hoặc ngược lại.
GitFlow branching diagram
GitFlow branching diagram

Commands thông dụng

git worktree add ../feature-x feature-x   # tạo worktree ở thư mục cha
git worktree list                         # liệt kê tất cả active
git worktree remove ../feature-x          # xóa khi xong
git worktree prune                        # cleanup orphan
git worktree add -b hotfix-2024.01 ../hotfix main  # branch mới từ main

Flag -b tạo branch mới trong worktree. Flag -f force overwrite nếu thư mục đã có. prune dọn dẹp các worktree entry không còn tồn tại trên disk (sau khi xóa thư mục thủ công).

Pattern thực tế

Khi cần hotfix production và vẫn tiếp tục develop:

git worktree add ../hotfix-2024.01 release/2024.01
cd ../hotfix-2024.01 && git cherry-pick abc123 && ./deploy.sh
cd ../main && git merge hotfix-2024.01
git worktree remove ../hotfix-2024.01

Pattern khác: maintain feature branch song song với release branch:

git worktree add ../release-2.0 release/2.0
git worktree add ../feature-auth feature/add-auth
# Build/test song song trong hai terminal
cd ../release-2.0 && make test
cd ../feature-auth && npm run test
Git branch merge visualization
Git branch merge visualization

Giới hạn và lưu ý

  • Branch lock: Không mở worktree cùng branch trên 2 thư mục — fatal: 'main' is already checked out at '/path/to/main'. Dùng flag --force nếu cần.
  • Branch delete: Cần xóa worktree trước khi xóa branch liên kết hoặc báo lỗi branch is used by worktree at '...'. Dùng git worktree remove trước.
  • Submodule: Git submodule bên trong worktree cần init riêng — không tự inherit từ main worktree. Chạy git submodule update --init --recursive.
  • CI/CD: Pipeline chưa auto-detect worktree; cần script git -C /path/worktree status --porcelain để check clean status.
  • Git hooks: Shared với main repo tại .git/hooks/. Mỗi worktree dùng chung hooks — nếu cần custom hook/worktree, dùng core.hooksPath trong worktree config.

Khi nào dùng

  • Maintain nhiều release branches song song (support 2024.01 + develop v2).
  • Review PR lớn: checkout ở worktree riêng, giữ main workspace sạch cho hot work.
  • Test patch hotfix trong khi feature branch đang chạy long-running build.
  • Pair programming: mỗi dev một worktree, push/pull song song không conflict.
  • Run multiple instance của service với config khác nhau cùng lúc.

Kết luận

Git worktree giải quyết pain point “chuyển context branch liên tục” bằng cách cung cấp môi trường tách biệt cho từng branch. Tiết kiệm thời gian stash/pop, tránh merge conflict ngoài ý muốn, và giúp parallelize công việc trên nhiều version cùng lúc. Tool đơn giản nhưng productivity multiplier cho team maintain nhiều release hoặc developer làm việc multi-context.

Đối với iOS dev như bạn, worktree hữu ích khi maintain nhiều version app (production v1.x, staging v2.x beta) cùng lúc — mỗi version cần Xcode build, Fastlane deploy riêng. Thay vì checkout liên tục, mở 2 worktree, 2 terminal, 2 simulator instance.

Nguồn tham khảo:

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

Sơ đồ workflow migrate và sqlc trong CI/CD pipeline

Database migration an toàn với Golang golang-migrate sqlc Atlas so sánh

Tại sao cần database migration tool trong Golang Khi xây dựng ứng dụng production với Golang, việc quản lý thay đổi schema database là bài toán bắt buộc. Ba công…

Xem thêm

TypeScript 5.5: type inference cải tiến, decorators chuẩn hóa, isolated declarations

Giới thiệu TypeScript 5.5 mang đến những cải tiến đáng kể cho hệ thống kiểu dữ liệu, khiến mã nguồn an toàn hơn và dễ bảo trì hơn. Bài viết…

Xem thêm

So sánh các web framework Python phổ biến

Giới thiệu So sánh các web framework Python phổ biến là một trong những chủ đề nóng nhất trong thời gian qua. Bài viết này sẽ cung cấp một cái…

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