- Git theo dõi thay đổi của tệp và lưu lịch sử ngay trên máy bạn; hầu hết thao tác chạy cục bộ, không cần mạng.
- Một tệp trong Git ở một trong ba trạng thái: đã sửa, đã chuẩn bị (staged), đã commit. Mọi thứ Git lưu được gắn một mã băm SHA-1 dài 40 ký tự.
- GitHub lưu kho Git trên mạng và thêm issue, pull request, Actions để cộng tác. Bạn dùng được Git mà không cần GitHub, nhưng GitHub thì xây trên Git.
Bài này dựa trên tài liệu của GitHub và sách Pro Git trên trang chính thức git-scm.com, đọc ngày 11/11/2026. Đoạn code trong bài chạy Git thật (phiên bản 2.55 trên máy thử) trong một thư mục tạm.
Git là gì?
Tài liệu GitHub mô tả Git là hệ thống quản lý phiên bản (version control system) theo dõi thay đổi của các tệp. Nó cho bạn làm việc trên bản sao dự án của riêng mình rồi gộp thay đổi của bạn với của người khác một cách an toàn.
Nếu bạn từng có các tệp bai_tap_v2_final.py, bai_tap_v3_sua_lan_cuoi.py, thì bạn đã tự làm "quản lý phiên bản" bằng tay. Git làm việc đó gọn hơn: chỉ có một tệp bai_tap.py, còn mọi phiên bản cũ nằm trong lịch sử, có lời mô tả, có thời điểm, và quay lại được bất cứ lúc nào.
Sách Pro Git nêu vài đặc điểm làm Git khác các hệ thống cũ:
- Lưu ảnh chụp, không lưu phần chênh lệch. Mỗi lần commit, Git ghi lại trạng thái của mọi tệp như một ảnh chụp và giữ tham chiếu tới ảnh chụp đó; tệp không đổi thì trỏ tới bản cũ thay vì lưu lại.
- Hầu hết thao tác chạy cục bộ. Toàn bộ lịch sử nằm trên ổ đĩa của bạn, nên xem lịch sử hay so sánh thay đổi chạy nhanh và làm được khi không có mạng. Bạn commit trên máy rồi đẩy lên sau.
- Toàn vẹn dữ liệu. Mọi thứ được tính mã băm SHA-1 trước khi lưu và được gọi bằng mã đó, một dãy 40 ký tự thập lục phân. Nội dung tệp không thể bị đổi mà Git không biết.
- Git hầu như chỉ thêm dữ liệu. Gần như mọi thao tác đều thêm vào cơ sở dữ liệu của Git, nên một ảnh chụp đã commit rất khó mất, nhất là khi bạn thường xuyên đẩy lên một kho khác.
GitHub là gì?
Theo tài liệu của GitHub, GitHub là nền tảng hỗ trợ toàn bộ quá trình phát triển phần mềm, từ lập kế hoạch tới vận hành. Git theo dõi thay đổi trong bản sao dự án trên máy bạn; GitHub lưu các dự án Git đó, gọi là kho (repository), trên mạng và thêm công cụ lập kế hoạch và cộng tác.
Những gì GitHub thêm vào so với Git thuần:
- một nơi chung để cả nhóm đẩy lên và kéo về cùng một kho;
- pull request: đề xuất thay đổi để người khác xem và góp ý trước khi gộp;
- issue: ghi lại lỗi và việc cần làm;
- GitHub Actions: tự chạy test hay việc lặp lại mỗi khi có thay đổi;
- trang hồ sơ, nơi người khác xem các dự án bạn đã làm.
Ngoài GitHub còn có các nền tảng khác cùng loại như GitLab và Bitbucket; cách dùng Git trên chúng giống nhau.
Git và GitHub khác nhau ở đâu?
| Git | GitHub | |
|---|---|---|
| Là gì | Phần mềm quản lý phiên bản | Nền tảng web lưu kho Git và cộng tác |
| Chạy ở đâu | Trên máy bạn | Trên mạng |
| Cần mạng không | Không, trừ khi đẩy hay kéo | Có |
| Dùng để | Lưu lịch sử, tạo nhánh, gộp thay đổi | Chia sẻ, xem thay đổi, góp ý, báo lỗi, tự động hóa |
| Có thể thay bằng | Ít khi thay | GitLab, Bitbucket và nền tảng khác |
Ba trạng thái và ba khu vực trong Git
Đây là phần quan trọng nhất để hiểu Git, và cũng là phần người mới hay bỏ qua. Theo Pro Git, một tệp đang được Git theo dõi ở một trong ba trạng thái:
| Trạng thái | Nghĩa |
|---|---|
| Đã sửa (modified) | Tệp đã thay đổi nhưng chưa commit |
| Đã chuẩn bị (staged) | Thay đổi đã được đánh dấu để đi vào lần commit tới |
| Đã commit (committed) | Đã lưu an toàn vào cơ sở dữ liệu trên máy |
Tương ứng là ba khu vực: thư mục làm việc (working tree, nơi bạn sửa tệp), khu chuẩn bị (staging area, còn gọi là index, ghi những gì sẽ vào commit tới), và thư mục Git (nơi chứa lịch sử và cơ sở dữ liệu của kho; đây là phần được sao chép khi bạn clone một kho).
Vòng làm việc cơ bản gồm ba bước: sửa tệp trong thư mục làm việc, chọn những thay đổi muốn lưu và đưa vào khu chuẩn bị, rồi commit để lưu ảnh chụp đó vào thư mục Git.
Vì sao cần khu chuẩn bị? Vì bạn hay sửa nhiều thứ cùng lúc. Có khu chuẩn bị, bạn chọn được: commit phần sửa lỗi trước, phần thêm tính năng sau, mỗi commit một ý rõ ràng.
Xem ba trạng thái bằng Git thật
Đoạn Python dưới đây tạo một kho Git trong thư mục tạm, rồi tạo tệp, git add, git commit, sửa tệp, và in kết quả git status --short sau mỗi bước. Cần đã cài Git; thư mục tạm bị xóa khi chạy xong.
"""Xem ba trạng thái của một tệp trong Git bằng cách chạy Git thật trong một thư mục tạm.
Cần đã cài Git. Thư mục tạm bị xóa khi chạy xong, không đụng tới dự án của bạn.
Phần cuối tự tính mã băm SHA-1 của tệp theo cách Git làm (gắn tiền tố "blob <độ dài>\\0" rồi băm),
và so với kết quả của lệnh git hash-object.
"""
import hashlib
import subprocess
import tempfile
NOI_DUNG = "print('Xin chào')\n"
def git(thu_muc, *tham_so):
lenh = ["git", "-c", "user.name=Hoc Vien", "-c", "user.email=hocvien@example.com", *tham_so]
return subprocess.run(lenh, cwd=thu_muc, capture_output=True, text=True, encoding="utf-8", check=True).stdout
def trang_thai(thu_muc):
ra = git(thu_muc, "status", "--short").rstrip("\n")
return ra if ra else "(sạch)"
def bam_nhu_git(du_lieu: bytes) -> str:
return hashlib.sha1(b"blob " + str(len(du_lieu)).encode() + b"\0" + du_lieu).hexdigest()
def chay_thu():
with tempfile.TemporaryDirectory() as tm:
git(tm, "init", "-q")
with open(f"{tm}/bai_tap.py", "w", encoding="utf-8", newline="\n") as f:
f.write(NOI_DUNG)
print("1. Tạo tệp mới ->", trang_thai(tm), " (Git chưa theo dõi)")
git(tm, "add", "bai_tap.py")
print("2. git add ->", trang_thai(tm), " (đã vào khu chuẩn bị)")
git(tm, "commit", "-q", "-m", "Thêm bài tập đầu tiên")
print("3. git commit ->", trang_thai(tm), " (đã lưu vào kho)")
with open(f"{tm}/bai_tap.py", "a", encoding="utf-8", newline="\n") as f:
f.write("print('Tạm biệt')\n")
print("4. Sửa tệp ->", trang_thai(tm), " (đã sửa, chưa chuẩn bị)")
tu_tinh = bam_nhu_git(NOI_DUNG.encode("utf-8"))
tu_git = subprocess.run(["git", "hash-object", "--stdin"], input=NOI_DUNG.encode("utf-8"),
capture_output=True, check=True).stdout.decode().strip()
print("Mã băm Python tính:", tu_tinh)
print("Mã băm Git tính: ", tu_git)
return tu_tinh, tu_git
if __name__ == "__main__":
chay_thu()
Kết quả khi chạy:
1. Tạo tệp mới -> ?? bai_tap.py (Git chưa theo dõi)
2. git add -> A bai_tap.py (đã vào khu chuẩn bị)
3. git commit -> (sạch) (đã lưu vào kho)
4. Sửa tệp -> M bai_tap.py (đã sửa, chưa chuẩn bị)
Mã băm Python tính: b806ee1b883feac991061c9f87dae10a75ebf041
Mã băm Git tính: b806ee1b883feac991061c9f87dae10a75ebf041
Cách đọc ký hiệu: ?? là tệp Git chưa theo dõi; A ở cột đầu là tệp mới đã vào khu chuẩn bị; dòng trống nghĩa là thư mục làm việc khớp với commit gần nhất; M ở cột thứ hai là tệp đã sửa nhưng chưa đưa vào khu chuẩn bị.
Hai dòng cuối cho thấy mã băm không có gì bí ẩn: Git ghép tiền tố "blob", độ dài nội dung và một byte 0 vào trước nội dung tệp, rồi tính SHA-1. Python tính theo đúng cách đó ra cùng dãy 40 ký tự với lệnh git hash-object. Đổi dù chỉ một chữ trong tệp, mã băm đổi hẳn. Đó là lý do Pro Git nói nội dung không thể bị thay đổi mà Git không biết.
Cài đặt và cấu hình Git
Tài liệu GitHub hướng dẫn tải bản Git mới nhất từ trang git-scm.com. Sau khi cài, mở terminal và kiểm tra:
git --version
Việc tiếp theo là khai tên và email, vì mỗi commit đều ghi tên người tạo. Sách Pro Git hướng dẫn đặt một lần cho cả máy:
git config --global user.name "Nguyen Van A"
git config --global user.email "ban@example.com"
Nếu muốn email cá nhân không hiện công khai trong lịch sử commit, GitHub có tùy chọn dùng địa chỉ email riêng tư do GitHub cấp; xem trang hướng dẫn đặt email commit của GitHub.
Để đẩy code lên GitHub, bạn cần xác thực. Tài liệu GitHub nêu ba cách: dùng HTTPS kèm trình quản lý thông tin đăng nhập (cách được khuyên dùng), dùng GitHub CLI với lệnh gh auth login, hoặc dùng khóa SSH tạo trên từng máy. Nếu không muốn dùng dòng lệnh, GitHub Desktop là ứng dụng có giao diện để làm việc với Git trên máy. Các bước tạo kho và đẩy lần đầu có trong bài đưa code lên GitHub.
Vì sao người học AI nên dùng Git từ sớm?
Với người học AI, Git có ba lợi ích cụ thể:
- Thí nghiệm không sợ hỏng. Bạn thử đổi kiến trúc mô hình hay bước xử lý dữ liệu; nếu kết quả tệ đi, quay về commit trước. Tạo nhánh riêng cho mỗi thí nghiệm để bản chính luôn chạy được.
- Kiểm soát việc AI sửa code. Công cụ AI lập trình có thể sửa nhiều tệp một lúc. Commit trước khi giao việc cho AI, và bạn luôn xem được AI đã đổi gì bằng
git diff, hoặc quay lại nếu không vừa ý. Tài liệu Claude Code ghi rằng chức năng quay lại của nó chỉ áp dụng cho thay đổi tệp; Git cho bạn thêm một lớp lịch sử bền vững, độc lập với công cụ. - Có lịch sử để kể. Khi xin thực tập, một kho có lịch sử commit đều đặn, lời mô tả rõ ràng nói lên cách bạn làm việc tốt hơn một kho chỉ có một commit "upload".
Lộ trình đầy đủ từ Git tới làm việc nhóm và portfolio có trong bài GitHub cho người học AI.
- Nhầm Git với GitHub: lỗi "chưa commit" là chuyện trên máy, lỗi "chưa push" là chuyện lên mạng.
- Quên
git addrồi thắc mắc vì sao commit không có thay đổi vừa sửa. - Gộp cả chục việc vào một commit với lời mô tả "update": sau này không biết commit nào làm gì.
- Commit thư mục môi trường ảo, tệp lớn hay tệp chứa khóa API; hãy tạo
.gitignoretrước lần commit đầu. - Dùng tên và email khác nhau trên mỗi máy, khiến lịch sử commit lộn xộn.
Câu hỏi thường gặp
Có cần học Git trước khi dùng GitHub không?
Nên. GitHub xây trên Git, và phần lớn việc hằng ngày (commit, tạo nhánh, xem thay đổi) là việc của Git trên máy bạn. Nắm ba trạng thái và bốn lệnh add, commit, push, pull là đủ để bắt đầu.
Git có miễn phí không?
Có. Git là phần mềm mã nguồn mở, tải từ git-scm.com. GitHub có gói miễn phí cho tài khoản cá nhân, kho công khai và kho riêng tư cơ bản.
Commit và push khác nhau thế nào?
Commit lưu thay đổi vào lịch sử trên máy bạn. Push đẩy các commit đó lên kho trên GitHub. Bạn có thể commit nhiều lần khi không có mạng rồi push một lần sau.
Mã băm của commit dùng để làm gì?
Mỗi commit được gọi bằng mã băm SHA-1 của nó, một dãy 40 ký tự. Bạn dùng mã này (thường chỉ cần vài ký tự đầu) để xem, so sánh hay quay về đúng commit đó.
Nên dùng dòng lệnh hay GitHub Desktop?
Người mới có thể bắt đầu bằng GitHub Desktop để thấy rõ thay đổi, nhưng nên học các lệnh cơ bản vì hướng dẫn của dự án AI và các công cụ AI lập trình đều dùng lệnh.
Học tiếp
- Tạo kho đầu tiên và đẩy code lên: đưa code lên GitHub.
- Xem lộ trình đầy đủ: GitHub cho người học AI.
- Học cách làm việc nhóm qua pull request: issue và pull request.
Nếu bạn muốn học lập trình và AI bài bản cùng giảng viên, tham khảo khóa học AI của Big-O Coding.
Khóa AI – Introduction to Machine Learning: nền tảng Máy học từ thuật toán cơ bản đến Neural Networks và LLM, học bằng Python. Học thử buổi 1 miễn phí.


