Git Plumbing: Đừng chỉ gõ ‘commit’ và ‘push’, hãy học cách ‘mổ xẻ’ Git từ bên trong

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Git không chỉ là những lệnh commit hay push thông thường

Bạn đã bao giờ “toát mồ hôi hột” vì lỡ tay git reset --hard trên production chưa? Hồi mới vào nghề, mình cứ nghĩ Git chỉ là công cụ copy-paste file xịn xò. Cho đến khi mình làm hỏng cấu trúc một repository lớn, mình mới nhận ra các lệnh thông thường đôi khi vô dụng. Lúc đó, mình buộc phải chui vào tận cùng của thư mục .git để nhặt nhạnh từng mảnh dữ liệu.

Đa số lập trình viên chỉ quen với git status, git branch hay git checkout. Trong thế giới Git, đây gọi là các lệnh Porcelain (đồ sứ). Chúng giống như cái bồn rửa mặt: bóng bẩy, dễ dùng và sạch sẽ. Tuy nhiên, để hệ thống đó vận hành, cần có mạng lưới ống nước chằng chịt bên dưới. Đó chính là các lệnh Plumbing (đường ống).

Nắm vững Plumbing commands giúp bạn xử lý những ca “khó đẻ” khi Git lỗi. Ngoài ra, đây cũng là nền tảng để bạn tự viết các tool hỗ trợ phát triển riêng cho team.

Git thực chất là một hệ thống lưu trữ nội dung (Key-Value)

Nhiều người lầm tưởng Git lưu trữ sự thay đổi (diff) giữa các phiên bản. Thực tế, Git hoạt động như một hệ thống Key-Value đơn giản. Key là mã băm SHA-1 dài 40 ký tự của nội dung file, còn Value chính là dữ liệu đó.

Giả sử bạn thay đổi đúng một dấu phẩy trong file 1GB. Git sẽ tạo ra một object mới hoàn toàn thay vì chỉ lưu dấu phẩy đó. Nhờ cơ chế nén zlib, dung lượng repo vẫn được tối ưu. Để thao tác trực tiếp với các object này, bạn cần bộ ba: hash-object, cat-file, và rev-parse.

Thực hành thao tác với Git Plumbing

1. Git hash-object: Tạo định danh cho dữ liệu

Lệnh này lấy một đoạn dữ liệu, tính toán mã SHA-1 và có thể lưu thẳng vào database của Git. Đây chính là việc git add vẫn làm ngầm mỗi ngày.

# Chỉ tính mã hash mà không lưu
echo "itfromzero tutorial" | git hash-object --stdin

# Tính toán và lưu trực tiếp vào .git/objects
echo "hello world" | git hash-object -w --stdin

Khi thêm flag -w (write), Git tạo một file trong .git/objects. Nếu mã hash là 3b18e512..., bạn sẽ thấy file nằm tại .git/objects/3b/18e512.... Việc chia 2 ký tự đầu làm thư mục giúp tránh tình trạng một folder chứa hàng vạn file, gây chậm hệ thống.

Đôi khi cần kiểm tra nhanh checksum của file mà không muốn gõ lệnh, mình hay dùng Hash Generator. Công cụ này chạy hoàn toàn trên trình duyệt nên cực kỳ an toàn cho các dữ liệu nhạy cảm.

2. Git cat-file: Chiếc kính hiển vi soi Object

Có mã hash rồi, làm sao để đọc nội dung bên trong? git cat-file chính là công cụ giúp bạn giải mã các loại object từ blob, tree đến commit.

# Kiểm tra kiểu của object
git cat-file -t 3b18e512dba79e4c8300dd08aeb37f8e728b8dad

# Xem nội dung đã được giải nén
git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad

Flag -p (pretty print) là cứu cánh khi mình cần debug một commit bị hỏng. Nó giúp mình truy vết xem commit đó đang trỏ đến những file cụ thể nào tại một thời điểm nhất định.

3. Git rev-parse: Thông dịch viên cho máy tính

Con người thích dùng tên gợi nhớ như main, HEAD hay tag v1.0. Ngược lại, Git chỉ hiểu mã SHA-1 khô khan. git rev-parse đóng vai trò thông dịch viên giữa hai bên.

# Lấy mã hash của branch hiện tại
git rev-parse main

# Tìm mã hash của commit ngay trước HEAD
git rev-parse HEAD~1

Trong các script CI/CD, mình thường dùng git rev-parse HEAD. Lệnh này giúp lấy chính xác ID phiên bản đang deploy để ghi log mà không quan tâm tên branch là gì.

Tại sao bạn nên quan tâm đến những lệnh “khô khan” này?

Dùng GUI như GitKraken hay VS Code rất tiện, nhưng chúng không giúp bạn xử lý được gốc rễ vấn đề. Hiểu về Plumbing mang lại 3 lợi ích sát sườn:

  • Khôi phục dữ liệu: Mình từng tìm lại được 90% code bị xóa nhầm nhờ quét dangling blobs. Đó là những mảnh dữ liệu lơ lửng không có branch nào trỏ tới.
  • Tối ưu dung lượng: Bạn có thể viết script kết hợp cat-file để tìm ra file “nặng mông” nhất đang làm chậm tốc độ clone repo.
  • Làm chủ cuộc chơi: Khi hiểu Git là một đống file Key-Value, những khái niệm như “detached HEAD” sẽ không còn làm bạn hoang mang.

Khi xử lý log hoặc cấu hình Git hooks, mình hay dùng JSON Formatter để dọn dẹp dữ liệu. Kết hợp công cụ tốt và tư duy hệ thống sẽ giúp bạn làm việc nhanh hơn đáng kể.

Lời kết

Học lệnh Plumbing giống như việc bạn mở nắp capo xe hơi để xem động cơ vận hành. Có thể bạn không sửa máy mỗi ngày, nhưng kiến thức đó sẽ cứu bạn khi xe hỏng giữa đường. Hãy thử tạo một repo trống và tự tay xây dựng một commit bằng các lệnh tầng thấp. Bạn sẽ thấy Git thực chất rất logic và minh bạch, không hề là một “chiếc hộp đen” bí ẩn.

Share: