Fundamentals
Git, Phần 6: Team thống nhất lịch sử thế nào
Team thống nhất ref nào dịch — trunk, pull request, và hook chặn gì được vào lịch sử chia sẻ.
- Gieo
- Chăm lần cuối

Phần 1–5 mô tả object và lệnh trên một máy và giữa hai repo. Team thêm thỏa thuận: ref nào trên origin được dịch, ai được dịch, và kiểm tra gì chạy trước. Sau bài này bạn đọc “trunk-based” và “pull request” là mẫu chuyển ref, không phải logo sản phẩm — và biết hook được phép chặn gì.
Đây là Phần 6 trong loạt sáu phần — nơi phán đoán chiến lược branch cuối cùng thuộc về.
Nó là gì?
Nguồn sự thật chia sẻ thường là origin/main (hoặc origin/trunk, origin/develop — tên khác nhau; ý giống nhau). Mọi người clone object database đó. main local là nhãn trên bản copy; origin/main là ảnh nhãn chia sẻ lần cuối bạn biết.
Luồng trunk-based giữ phần lớn việc lên một branch chia sẻ thường xuyên. Branch local ngắn hạn có thể có, nhưng mục tiêu là commit nhỏ tích hợp main liên tục. Chuyển ref đơn giản: origin/main tiến nhiều lần một ngày; feature branch nếu có sống vài giờ hoặc vài ngày.
Luồng pull-request (merge request, tên host khác nhau) thêm cổng review trước khi origin/main dịch. Bạn push ref topic branch — origin/feature/login — và nhờ team merge vào main. Đến lúc merge, main chia sẻ đứng yên; tích hợp khi maintainer chấp nhận merge hoặc chính sách rebase-and-merge.
Cả hai vẫn dùng fetch, push, merge, có thể rebase từ phần trước. Khác biệt là ref nào dịch khi nào, và ai được dịch origin/main.
Hook là script Git chạy tại sự kiện như pre-commit, pre-push, hoặc pre-receive trên server. Hook có thể từ chối push nếu test fail, lộ secret, hoặc message commit không khớp pattern. Hook thực thi chính sách; không thay code review hay CI — bổ sung chúng.
Khi nào dùng?
Chọn nhịp trunk-based khi team nhỏ, release liên tục, mọi người tích hợp nhanh với test tự động mạnh. Giá là kỷ luật: main hỏng làm tổn cả team ngay.
Chọn pull-request flow khi review, tuân thủ hay release train cần cổng người hoặc bot trước khi origin/main tiến. Giá là độ trễ và đồ thị merge phức tạp — merge commit hay squash merge thành lựa chọn chính sách từ Phần 2 và 5.
Dùng hook local cho phản hồi nhanh (format, lint khi commit). Dùng hook server hoặc CI khi push cho quy tắc không được bỏ qua. CI trên pull request vẫn về ref: test tip bạn muốn merge vào main.
Không workflow nào bỏ quy tắc cốt lõi Git: push dịch ref trên remote. Thỏa thuận team là chuyển động nào được phép, không phải né toàn vẹn object.
Demo tương tác
Hình dung origin/main là ref tím chia sẻ. Chế độ trunk, commit nhỏ trượt ref nhiều lần. Chế độ pull-request, origin/feature lớn trước; chỉ sau “approve” origin/main nhảy gồm việc đó — merge commit hay fast-forward tùy toggle scene. Bước hook nhấp nháy đỏ khi push vi phạm chính sách và xanh khi check pass.
Minh họa tương tác
Code
Các đoạn mô tả hành vi; không phải setup org đầy đủ. Khái niệm đối chiếu tài liệu Git 2.43.0.windows.1 và chạy hook local.
Chuyển ref chia sẻ (khái niệm)
$ git fetch origin
$ git switch main
$ git merge --ff-only origin/main # or rebase feature onto origin/main first
$ git push origin main
Trong luồng trunk, git push origin main sau CI xanh là sự kiện tích hợp. --ff-only khi merge là chính sách một số team để main không nhận merge commit vô tình từ pull cẩu thả.
$ git push -u origin feature/oauth
$ # review happens outside Git; then on the server or via merge button:
$ git switch main
$ git pull origin main
$ git merge feature/oauth # or squash merge via host UI
$ git push origin main
Trong pull-request flow, origin/feature/oauth dịch trước. origin/main dịch chỉ sau review — merge local hay host merge hộ, cập nhật đồ thị vẫn là “main giờ gồm các commit đó.”
Ví dụ hook (client pre-push)
$ cat .git/hooks/pre-push
#!/bin/sh
# reject push if tests fail
npm test || exit 1
Hook chạy với exit code shell: khác zero hủy thao tác. Hook server thấy cập nhật ref trước khi land; hook client có thể bỏ qua bằng --no-verify — lý do branch protected cũng cần quy tắc server.
Mã nguồn
Mã nguồn
Chỉ đọcTooling/Git/shared-refs.sh
Chỉ đọc
# Shared repo: main and a pull-request branch ref
git fetch origin
# Open a PR (hosting UI) — compares refs, no local merge yet
# gh pr create --base main --head feature
# Integrate on main (fast-forward or merge commit)
git switch main
git merge feature
# A server-side hook can reject the push before refs move
# pre-receive: block force-push to main
Ưu và nhược điểm
+ Ưu điểm
- Gọi workflow là chuyển ref giữ thảo luận bám fetch, push và merge từ Phần 2–5.
- Trunk-based giảm phân kỳ sống lâu khi test và văn hóa hỗ trợ tích hợp nhanh.
- Pull-request flow thêm review và kiểm toán trước khi origin/main dịch, hữu ích team lớn hoặc có quy định.
- Hook tự động hóa chính sách lặp để cùng lỗi bị bắt trước khi thành lịch sử chia sẻ.
− Nhược điểm
- Trunk-based trừng phạt CI yếu; một push xấu chặn mọi người đến khi sửa hoặc revert.
- Pull-request flow tích tụ branch cũ và đồ thị merge ồn nếu không xóa ref đã merge.
- Hook chỉ phía client không đủ vì có --no-verify; cổng server hoặc CI vẫn cần.
- Tranh chiến lược làm lệch cơ học trừ khi mọi người thống nhất ref nào là thiêng.
Mẹo
- 01Ghi rõ branch nào protected và force-push có bao giờ được phép; trỏ Phần 5 trước khi ai rebase branch chia sẻ.
- 02Khớp merge versus squash versus rebase-and-merge với hình git log bạn muốn sáu tháng sau.
- 03Chạy cùng test trong CI mà hook chạy local, nếu không hook cảm giác như diễn.
- 04Xóa hoặc auto-delete topic branch đã merge để origin không thành nghĩa trang ref cũ.
- 05Khi incident cần revert, dùng git revert trên main chia sẻ từ Phần 3 — không reset trên origin.
- 06Đọc lại Phần 4 trước khi đổ lỗi host: fetch, push và ref tracking giải thích hầu hết bất ngờ đồng bộ.
Series
- Phần 1: Git, Phần 1: Commit là snapshot, branch là nhãn dán
- Phần 2: Git, Phần 2: Merge nối hai nhánh snapshot
- Phần 3: Git, Phần 3: Restore, revert và reset đụng các lớp khác nhau
- Phần 4: Git, Phần 4: Remote là một repository khác
- Phần 5: Git, Phần 5: Rebase replay commit lên parent mới
- Phần 6: Git, Phần 6: Team thống nhất lịch sử thế nào