Git 2.52–2.54: Worktrees, Viết Lại History, và Tốc Độ Monorepo

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ảnKhoảng thời gianGhi chú upstreamÝ chính
2.52~11/2025Documentation/RelNotes/2.52.0.adocGeometric maintenance task, git last-modified, git repo (thử nghiệm).
2.53Đầu 2026Documentation/RelNotes/2.53.0.adocPromisor + geometric repack, git maintenance is-needed, v.v.
2.54~04/2026Documentation/RelNotes/2.54.0.adocgit 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 repair khô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ùng git worktree move. Ở dòng 2.54, phần mới rõ hơn là tài liệu quanh git worktree list / prune (gồm --expire). Nếu bạn đổi tên thư mục thủ công, repair vẫn là công cụ — chỉ đừng gán cả tính năng đó cho riêng bộ release này.
  • Coi git worktree list như dashboard: path ↔ nhánh ↔ HEAD.

Chi tiết vận hành thường gặp

  1. Ưu tiên git worktree move khi đổi tên cây liên kết — khi đó hiếm cần repair.
  2. 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.

  1. git config --worktree có 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ạnhgit rebase -igit history (thử nghiệm)
Working treeGắn chặtThiết kế để không cần
Bare repoKhóUse case được nhắm tới
Rủi roĐội quen tayNgữ 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 -p hiể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ờ.

Luồng

0
⌘/Ctrl+Enter để gửiGõ / để xem lệnh · Tab để @nhắc tên