Git commit là gì và nó chứa những gì?
Đáp án mẫu
Commit là một bản snapshot bất biến của toàn bộ project tại một thời điểm, kèm metadata giải thích cho nó. Commit không phải là diff: Git lưu trạng thái đầy đủ của cây thư mục và chỉ tính sự khác biệt khi bạn yêu cầu.
Mỗi commit chứa con trỏ tới một tree (snapshot của thư mục), hash của commit parent (merge commit có hai parent, commit đầu tiên không có), tên, email và thời gian của author và committer, cùng commit message. Git băm toàn bộ thông tin đó thành một SHA duy nhất để định danh commit.
git log -1 --format='%H %P %an %s'
git cat-file -p HEAD
Vì hash đã bao gồm hash của parent, mỗi commit "niêm phong" lịch sử phía trước. Sửa bất kỳ commit cũ nào thì mọi hash phía sau đều đổi.
Branch và tag chỉ là nhãn trỏ vào một commit. Hãy commit các thay đổi nhỏ, nhất quán và có message rõ ràng, vì commit là đơn vị bạn review, revert và cherry-pick.
Ý chính
- Commit là snapshot đầy đủ, không phải diff
- Chứa tree, hash parent, author, committer, message
- Hash SHA định danh commit và bao gồm cả parent
- Branch và tag chỉ là con trỏ tới commit
Câu hỏi nối tiếp thường gặp
- Vì sao amend một commit lại tạo hash mới?
- Author và committer khác nhau như thế nào?
Lỗi thường gặp
- Tin rằng commit chỉ lưu diff
- Nghĩ rằng branch là một bản sao của các file