Công cụ 22/09/2026 6 phút

Reflog trong Git: vì sao gần như không thao tác nào làm mất commit vĩnh viễn

Nhiều người tưởng git reset --hard hay xoá nhánh là mất commit không cứu được, rồi hoảng loạn. Sự thật: Git ghi mọi lần HEAD dịch chuyển vào reflog, và commit mồ côi còn nằm trong kho hàng tuần trước khi bị gc dọn. Bài này khôi phục thật một reset --hard làm 'mất' hai commit và một nhánh đã xoá — chỉ bằng SHA đọc từ reflog.

Công cụ 22/09/2026 6 phút

Packfile trong Git: vì sao mỗi commit là snapshot mà .git không phình vô hạn

Git lưu snapshot đầy đủ mỗi commit chứ không lưu diff — nghe như thư mục .git phải nhân đôi mỗi lần sửa file lớn. Thực tế không. Bài này đo thật: 6 phiên bản của một file 622 KB, git gc gói lại chỉ còn 34 KB nhờ packfile nén delta. Mở verify-pack xem tận mắt chuỗi delta depth 1 đến 5, mỗi bản sửa chỉ tốn ~350 byte.

Công cụ 22/09/2026 6 phút

git status và git diff so cái gì với cái gì — và cái bẫy .gitignore ai cũng dính

Bạn gõ git status và git diff hàng chục lần mỗi ngày nhưng ít khi hỏi chúng so những gì. Câu trả lời nằm ở ba vùng: working tree, index, HEAD. Bài này đo thật: git diff so working với index, git diff --cached so index với HEAD, git status --short đọc bằng hai cột, và vì sao thêm file vào .gitignore không gỡ được file đã theo dõi.

Công cụ 22/09/2026 6 phút

git bisect: tìm commit gây lỗi trong 5 lần thay vì 30 — và cách để máy tự làm

Một tính năng vừa hỏng mà bạn không biết commit nào gây ra, giữa hàng trăm commit. Dò tuần tự là ác mộng. git bisect tìm nhị phân: mỗi lần chia đôi số commit khả nghi. Bài này đo thật trên 31 commit — bisect tìm ra thủ phạm chỉ sau 5 lần kiểm thử, và git bisect run để máy tự chạy hết bằng một script.

Công cụ 22/09/2026 6 phút

cherry-pick và detached HEAD: bê một commit lẻ, và vì sao HEAD rời không đáng sợ

Bạn chỉ muốn một commit hotfix từ nhánh tính năng sang main, không phải cả nhánh — đó là cherry-pick. Và trạng thái detached HEAD mà bisect/checkout hay đẩy bạn vào khiến nhiều người hoảng. Bài này đo thật: cherry-pick tạo commit mới cùng nội dung khác SHA, và một commit tạo trong detached HEAD mất hay được cứu tùy bạn có đặt tên nhánh hay không.

Công cụ 22/09/2026 6 phút

git fetch và git push trao đổi gì với máy chủ: want, have, và pack protocol

Push và fetch không gửi toàn bộ repo mỗi lần — chúng thương lượng để chỉ truyền object còn thiếu. Bài cuối sê-ri Git nội bộ mổ xẻ giao thức: ref advertisement, đàm phán want/have, rồi pack protocol gói phần thiếu. Đo thật bằng GIT_TRACE_PACKET — client nói want một SHA, have những SHA đã có, server chỉ gửi packfile chênh lệch. Và vì sao push đôi khi bị từ chối.