Làm chủ các lệnh Git cơ bản: init, status, add, commit, log và push không bị lỗi
Hướng dẫn thực hành các lệnh Git cơ bản gồm init, status, add, commit, log và push, kèm mô hình hoạt động, quy trình chuẩn và cách sửa lỗi Git/GitHub thường gặp.
ShanverseUpdated 9 min read— viewsLoading views
Git
Developer Tools
Git thường khiến người mới thấy khó không phải vì câu lệnh dài, mà vì mỗi lệnh tác động lên một khu vực khác nhau. Bài này giúp bạn hiểu đúng vai trò của từng lệnh, thực hành theo một luồng hoàn chỉnh và biết cách xử lý những lỗi thường gặp.
Luồng cần ghi nhớ
Mermaid
Loading diagram…
Bảng tóm tắt:
Comments
Chuẩn bị Git lần đầu
Kiểm tra Git đã được cài đặt:
Thiết lập tên và email dùng trong commit:
Kiểm tra cấu hình:
Tên và email này là metadata của commit. Chúng không phải thông tin đăng nhập GitHub.
1. git init — Khởi tạo repository
Di chuyển vào đúng thư mục dự án:
Git tạo thư mục ẩn .git, nơi chứa metadata, cấu hình, object và lịch sử repository.
Kiểm tra:
Đặt tên branch chính là main
Bạn có thể khởi tạo và đặt tên branch ngay từ đầu:
Hoặc đổi tên branch hiện tại:
Chạy git init lần nữa có mất code không?
Thông thường không. Git sẽ khởi tạo lại metadata cần thiết thay vì xóa file dự án hoặc commit hiện có. Tuy nhiên, đừng xóa thư mục .git nếu bạn muốn giữ lịch sử local.
Lỗi: fatal: not a git repository
Nguyên nhân: bạn chạy lệnh Git bên ngoài repository.
Kiểm tra thư mục hiện tại:
Sau đó chọn một trong hai cách:
hoặc, nếu đây là dự án mới:
2. git status — La bàn của repository
Chạy:
Lệnh này cho biết:
Branch hiện tại.
File Untracked.
Thay đổi Modified chưa staged.
Thay đổi đã Staged.
Branch local đang trước hay sau remote.
Repository có đang merge hoặc rebase hay không.
Dạng ngắn:
Một vài ký hiệu:
3. git add — Chọn snapshot cho commit
Stage một file:
Stage nhiều file:
Stage mọi thay đổi trong thư mục hiện tại:
Stage mọi thay đổi trong repository, bao gồm file bị xóa:
Xem nội dung đã chọn:
git add không lưu lịch sử
Lệnh này chỉ cập nhật staging area. Bạn vẫn cần git commit để tạo một mốc lịch sử.
Stage nhầm file
Bỏ file khỏi staging area nhưng giữ nội dung đã sửa:
Lỗi: pathspec ... did not match any files
Git không tìm thấy đường dẫn đã nhập. Kiểm tra:
Chú ý chữ hoa, chữ thường, khoảng trắng và vị trí thư mục hiện tại. Với đường dẫn có khoảng trắng:
4. git commit — Lưu snapshot vào lịch sử local
Sau khi stage, tạo commit:
Một commit gồm:
Snapshot của staging area.
Tên và email tác giả.
Thời điểm tạo.
Tham chiếu đến commit cha.
Commit message.
Commit message nên viết thế nào?
Thông điệp tốt mô tả mục đích của thay đổi:
Tránh:
Lỗi: Author identity unknown
Thiết lập danh tính:
Nếu chỉ muốn áp dụng cho repository hiện tại, bỏ --global.
Thông báo: nothing to commit, working tree clean
Đây không nhất thiết là lỗi. Nó có nghĩa không có thay đổi mới để commit.
Nếu bạn vừa sửa file nhưng vẫn thấy thông báo này:
Kiểm tra xem file có bị .gitignore bỏ qua hoặc bạn có đang ở nhầm thư mục không.
Thông báo: no changes added to commit
Bạn có thay đổi nhưng chưa stage:
Sửa commit message gần nhất
Nếu commit chưa push:
Amend tạo commit mới thay cho commit cũ. Hạn chế amend commit đã chia sẻ vì nó thay đổi lịch sử.
5. git log — Đọc lịch sử
Xem lịch sử đầy đủ:
Dạng ngắn gọn:
Hiển thị graph và tất cả branch:
Xem commit gần nhất:
Xem một commit cụ thể:
Xem lịch sử của một file:
Tìm commit theo nội dung message:
Thoát màn hình log bằng phím q khi Git mở pager.
Hiểu HEAD
HEAD thường trỏ đến branch hiện tại, và branch trỏ đến commit mới nhất. Vì vậy HEAD đại diện cho vị trí hiện tại của bạn trong lịch sử.
6. git push — Gửi commit lên GitHub
git push chỉ gửi commit, không gửi trực tiếp file Modified hoặc Staged chưa commit.
Trước tiên, tạo repository rỗng trên GitHub. Sau đó thêm remote:
Kiểm tra:
Đảm bảo branch là main:
Push lần đầu và thiết lập upstream:
Những lần sau:
HTTPS và SSH
Với HTTPS, GitHub không chấp nhận mật khẩu tài khoản như mật khẩu Git thông thường. Hãy dùng cơ chế xác thực do GitHub CLI, credential manager hoặc token hỗ trợ.
Với SSH, remote có dạng:
Đổi remote hiện tại sang SSH:
Quy trình hoàn chỉnh từ thư mục mới đến GitHub
Sửa các lỗi push phổ biến
error: src refspec main does not match any
Nguyên nhân thường gặp:
Repository chưa có commit đầu tiên.
Branch hiện tại không tên main.
Kiểm tra:
Nếu chưa có commit:
Nếu branch có tên khác:
fatal: 'origin' does not appear to be a git repository
Remote origin chưa tồn tại hoặc URL sai:
Thêm remote:
Hoặc sửa URL:
error: remote origin already exists
Không cần thêm lần nữa. Xem URL hiện tại:
Nếu URL sai:
rejected ... non-fast-forward
Remote có commit mà local chưa có, thường do repository GitHub được tạo kèm README hoặc LICENSE.
Cách an toàn:
Giải quyết conflict nếu có, sau đó:
Không dùng git push --force theo phản xạ. Force push có thể ghi đè lịch sử của người khác.
Permission denied (publickey)
Bạn đang dùng SSH nhưng GitHub chưa nhận diện SSH key phù hợp.
Kiểm tra kết nối:
Kiểm tra remote:
Bạn cần tạo SSH key, thêm public key vào GitHub và đảm bảo SSH agent đang sử dụng đúng key; hoặc chuyển remote sang HTTPS.
Authentication failed
Kiểm tra:
URL remote có đúng tài khoản và repository không.
Tài khoản có quyền ghi vào repository không.
Credential cũ có đang được lưu không.
Bạn có đang dùng phương thức xác thực GitHub hỗ trợ không.
GitHub CLI có thể giúp thiết lập xác thực:
Push thành công nhưng không thấy code
Kiểm tra branch vừa push:
Trên GitHub, chọn đúng branch. Hãy nhớ file chưa commit không thể xuất hiện trên remote.
Checklist trước khi push
Đang ở đúng repository.
Đang ở đúng branch.
git status không còn thay đổi cần commit.
git log --oneline có commit mong muốn.
git remote -v trỏ đúng repository.
Đã pull/rebase thay đổi mới của team khi cần.
Không có secret, .env hay file nhạy cảm trong lịch sử.
Thói quen giúp tránh lỗi
Chạy git status thường xuyên.
Dùng git diff trước khi stage và git diff --staged trước khi commit.
Stage theo từng file liên quan thay vì luôn dùng git add ..
Viết commit nhỏ và rõ mục đích.
Đọc lỗi từ dưới lên; dòng cuối thường mô tả hành động cần làm.
Kiểm tra branch và remote trước khi push.
Không force push khi chưa hiểu lịch sử nào sẽ bị thay đổi.
Tổng kết
Sáu lệnh cơ bản tạo thành một chuỗi logic:
init khởi tạo repository.
status giúp quan sát trạng thái.
add chọn snapshot.
commit lưu snapshot vào lịch sử local.
log giúp kiểm tra lịch sử.
push đồng bộ commit lên remote.
Table of contents(33)
Codeplain text
1?? notes.md # Untracked2 M app.js # Modified, chưa staged3M app.js # Đã staged4A new.js # File mới đã staged5MM app.js # Vừa có staged, vừa có sửa mới
Codeplain text
1feat: add user registration form2fix: prevent duplicate API requests3docs: explain local setup4refactor: extract validation helper
1# 1. Vào dự án2cdmy-project34# 2. Khởi tạo Git với branch main5gitinit-bmain67# 3. Kiểm tra trạng thái8gitstatus910# 4. Chọn file11gitadd.1213# 5. Kiểm tra snapshot sắp commit14gitdiff--staged1516# 6. Tạo commit đầu tiên17gitcommit-m"chore: initialize project"1819# 7. Xem lịch sử20gitlog--oneline2122# 8. Kết nối GitHub23gitremoteaddoriginhttps://github.com/username/repository.git2425# 9. Push lần đầu26gitpush-uoriginmain
Hướng dẫn Git Aliases và .gitconfig thực chiến: alias an toàn, log đẹp, cấu hình pull/push/rebase, includeIf cho tài khoản work/personal, bảo mật và chia sẻ dotfiles.
Phân tích Gitflow vs GitHub Flow vs Trunk-Based Development: cấu trúc branch, ưu nhược điểm, điều kiện áp dụng, ma trận quyết định và lộ trình chuyển đổi cho từng loại dự án.
Hướng dẫn git worktree từ cơ bản đến thực tế: tạo nhiều working tree, làm feature và hotfix song song, review PR, quản lý list/remove/prune/lock/repair và tránh lỗi phổ biến.