Bài viết mới nhất

Tổng 2300 bài
Công cụ 22/09/2026 5 phút

Ref, HEAD và branch trong Git: một nhánh chỉ là một con trỏ 41 byte

Nhiều người tưởng tạo branch là sao chép cả dự án, nên ngại tạo nhánh. Thực ra một branch chỉ là một file 41 byte chứa SHA của commit. Bài này chứng minh bằng lệnh thật: HEAD trỏ tới ref, ref trỏ tới commit, tạo branch = ghi 41 byte, chuyển branch = đổi con trỏ HEAD — và vì sao Git khuyến khích bạn tạo nhánh thoải mái.

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

Lịch sử Git là một DAG: commit trỏ cha, và lưu snapshot chứ không lưu diff

Nhiều người tưởng Git lưu 'các thay đổi' (diff) giữa các commit. Thực ra mỗi commit lưu một ảnh chụp (snapshot) toàn bộ cây, và trỏ tới commit cha — tạo thành một đồ thị có hướng không chu trình (DAG). Bài này chứng minh bằng lệnh thật: file không đổi dùng lại cùng blob qua nhiều commit, và merge tạo commit hai cha.

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

Merge ba chiều trong Git: base, ours, theirs — và vì sao có xung đột

Nhiều người sợ merge vì không hiểu Git làm gì. Thực ra merge của Git là 'ba chiều': nó tìm commit tổ tiên chung (merge base) rồi so với hai phía để biết bên nào đã đổi gì. Bài này chứng minh bằng lệnh thật: thay đổi khác vùng tự gộp, thay đổi cùng dòng gây xung đột, và index giữ cả ba phiên bản (base/ours/theirs).

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

Rebase trong Git: vì sao nó viết lại lịch sử — chứng minh bằng SHA thật

Nhiều người dùng rebase mà không hiểu nó khác merge chỗ nào, rồi hoảng khi thấy commit 'biến mất'. Sự thật: rebase KHÔNG di chuyển commit cũ — nó tạo commit MỚI với SHA khác vì đổi parent. Bài này chứng minh bằng lệnh thật: cùng nội dung, cùng message, nhưng SHA đổi hoàn toàn; lịch sử thẳng thay vì rẽ nhánh; và commit cũ vẫn nằm trong reflog để cứu.

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.