Git 2.52–2.54: Worktrees, Viết Lại History, và Tốc Độ Monorepo
Ba phiên bản Git vừa mang đến những tính năng tôi lâu nay mong chờ: worktrees song song không cần stash, viết lại commits mà không cần rebase, và geometric repacking biến hàng giờ thành vài phút.
Mục lục
Ba tuần gần đây tôi rebase một commit message ở giữa chuỗi, stash để checkout nhánh khác, và nhìn repack monorepo ăn mất bốn mươi phút trong một cửa sổ CI. Git 2.52 đến 2.54 xử lý đúng kiểu vấn đề đó — đủ cụ thể để đáng nâng cấp. Đây không phải “vài cải tiến UX” mà là thứ bạn cảm nhận trong cơ tay: ít chuyển ngữ cảnh hơn, bớt đau kiểu repack all-into-one của git gc, và một công cụ history (vẫn thử nghiệm) cư xử như interactive rebase mà không kéo working tree qua vòng đó.
Dưới đây là cách tôi ánh xạ từng release lên việc kỹ sư hàng ngày, kèm nguồn gốc chính thức để bạn đối chiếu trên toolchain của mình.
Nguồn chính thức (đọc trước)
| Phiên bản | Khoảng thời gian | Ghi chú upstream | Ý chính |
|---|---|---|---|
| 2.52 | ~11/2025 | Documentation/RelNotes/2.52.0.adoc | Geometric maintenance task, git last-modified, git repo (thử nghiệm). |
| 2.53 | Đầu 2026 | Documentation/RelNotes/2.53.0.adoc | Promisor + geometric repack, git maintenance is-needed, v.v. |
| 2.54 | ~04/2026 | Documentation/RelNotes/2.54.0.adoc | git history thử nghiệm, hooks trong config, maintenance mặc định geometric, HTTP 429 backoff. |
Bài tóm tắt (không thay RelNotes): GitHub — Git 2.52, GitHub — Git 2.54. Với partial clone ở quy mô lớn, GitLab — What’s new in Git 2.53 viết khá cụ thể.
Worktrees: dừng vũ điệu stash
Worktree xóa ma sát tinh vi: đổi nhánh khi cây làm việc còn bẩn. Stash được cho đến khi không — khôi phục staged vs unstaged sau vài lần nhảy là tốn thần kinh.
Worktrees cho nhiều checkout đồng thời — thư mục tách nhau, index/state độc lập, cùng một object database:
cd ~/src/myproject
git worktree add ../myproject-feature-auth feature/auth
cd ../myproject-feature-auth
git status # chỉ cây này
git commit -am "auth: OAuth2 handler"
cd ~/src/myproject # vẫn ở nhánh bạn để lại
2.52–2.54 thay đổi gì liên quan worktree?
git worktree repairkhông ra mắt ở 2.54 — nó đã có nhiều năm để sửa file quản trị sau khi path đổi tay mà không dùnggit worktree move. Ở dòng 2.54, phần mới rõ hơn là tài liệu quanhgit worktree list/prune(gồm--expire). Nếu bạn đổi tên thư mục thủ công,repairvẫn là công cụ — chỉ đừng gán cả tính năng đó cho riêng bộ release này.- Coi
git worktree listnhư dashboard: path ↔ nhánh ↔ HEAD.
Chi tiết vận hành thường gặp
- Ưu tiên
git worktree movekhi đổi tên cây liên kết — khi đó hiếm cầnrepair. - Cài đặt dependency trùng mỗi cây. Với Node, symlink chỉ hợp lý khi bạn cố ý:
# Cây phụ ../myproject-feature-auth cạnh main ../myproject — dùng lại bản cài của main
ln -s ../myproject/node_modules ./node_modules
Đổi path cho đúng layout của bạn; điểm là relative rõ ràng, không phải $(git rev-parse)/../node_modules vốn hiếm khi khớp cách bạn đặt worktrees. Store dùng chung của pnpm / npm hiện đại giảm đau dù không symlink.
git config --worktreecó từ Git 2.36, không phải phát minh 2.52 — nhưng đi đôi với đa worktree:
git config --worktree user.email "[email protected]"
git config --worktree --list
tmux: giữ đường dẫn rõ ràng
wt_scratch() {
local dir
dir="$(mktemp -d)"
git worktree add "$dir" --detach
tmux new-window -n "wt-${dir##*/}" -c "$dir"
}
git history: viết lại mà không đụng working tree
git history (thử nghiệm, 2.54) là điểm nhấn cho bare mirror và CI: reword hoặc split commit mà không qua machinery rebase tương tác, và không cần working tree đầy — automation và repo phía server lên hàng đầu.
git log --oneline -5
git history reword <commit>
git history split <commit>
Mô hình tinh thần
| Khía cạnh | git rebase -i | git history (thử nghiệm) |
|---|---|---|
| Working tree | Gắn chặt | Thiết kế để không cần |
| Bare repo | Khó | Use case được nhắm tới |
| Rủi ro | Đội quen tay | Ngữ nghĩa mới — ghim phiên bản Git trong CI |
Lưu ý: vẫn git push --force-with-lease khi rewrite history đã public.
Hooks: config trước (2.54), không chỉ core.hooksPath
core.hooksPath trỏ tới thư mục script vẫn dùng tốt; 2.54 cho phép nhiều hook command / sự kiện qua config (RelNotes).
[hook "lint"]
command = ~/.local/bin/git-hooks/lint-staged-wrapper
event = pre-commit
[hook "secrets"]
command = ~/.local/bin/git-hooks/gitleaks
event = pre-commit
git config --global hook.lint.command '~/.local/bin/git-hooks/lint-staged-wrapper'
git config --global --add hook.lint.event pre-commit
Vẫn có thể kết hợp với core.hooksPath khi repo muốn bộ hook riêng.
Geometric repack: 2.52 thêm gì vs 2.54 mặc định hóa
Git 2.52 thêm task geometric trong git maintenance — repack packfile theo cấp số nhân để tránh repack all-into-one liên tục (bài GitHub 2.52). Plumber đã có từ trước nhưng 2.52 đưa thành task lên lịch được.
Git 2.54: git maintenance mặc định dùng chiến lược geometric (RelNotes).
git maintenance start --scheduler=launchd # macOS
# git maintenance start --scheduler=systemd # Linux
Ghép với git maintenance is-needed (2.53) khi script muốn hỏi “có nên chạy tác vụ nặng ngay không?” trước khi block deploy.
Partial clone và promisor (2.53)
git clone --filter=blob:none không mới; đáng đọc ghi chú 2.53 về geometric repacking với promisor remote — cách pack on-disk và lời hứa “blob thiếu” tương tác (GitLab 2.53).
git clone --filter=blob:none --single-branch origin main
Hiệu năng và ergonomics
git last-modified (2.52)
Theo benchmark trong bài GitHub, git last-modified ~5.48× nhanh hơn vòng ls-tree | xargs git log -1 ngây thơ (nguồn).
git last-modified src/**/*.ts
HTTP (2.54)
429 Too Many Requests → backoff trong HTTP transport (RelNotes).
Khác
git rev-list --maximal-only(2.54)git status+status.compareBranches(2.54)git add -phiển thị trạng thái hunk (2.54)git rebase --trailer(2.54)
Công cụ history (thử nghiệm): git replay
git replay: 2.54 thêm mode revert, replay xuống root commit, xử lý commit rỗng (RelNotes).
Bộ lệnh tôi chạy
git maintenance start --scheduler=systemd
git config --global alias.lm 'last-modified'
git config --global alias.hs 'history split'
git rebase main --trailer 'Reviewed-by: [email protected]'
Git cũ trên máy/CI? Ghim git version trong image trước khi phụ thuộc git history — lệnh thử nghiệm có thể đổi ngữ nghĩa giữa các bản minor.
Kết
Ba phiên bản này trả lời người sống trong Git chứ không chỉ kế bên Git: worktrees đồng thời với thao tác rõ ràng hơn, bảo trì repo hiểu hình học monorepo, transport tôn trọng rate limit, và chỉnh history tách khỏi việc vẽ lại working tree.
Nâng bản stable mới nhất mà tổ chức cho phép, đọc RelNotes mỗi khi dùng tính năng thử nghiệm, và coi maintenance như job lên lịch như mọi hạ tầng khác.
Bài tiếp theo tự nhiên là ghim Git trong CI/Dockerfile để pipeline không bị git history và bạn bè làm bất ngờ.