Lỗi thường gặp và cách khắc phục
Bài trước: 12. Git Nâng cao
Bài tiếp theo: 14. Tag và Release
🎯 Mục tiêu học tập
- Nhận biết các lỗi Git phổ biến
- Biết cách xử lý từng loại lỗi
- Phòng tránh lỗi bằng best practices
- Khôi phục code khi gặp sự cố
📘 Kiến thức lý thuyết
Phân loại lỗi Git
| Loại lỗi | Ví dụ | Mức độ nghiêm trọng |
|---|---|---|
| Authentication | Permission denied, wrong credentials | Trung bình |
| Merge conflict | CONFLICT khi merge/pull | Trung bình |
| Lost code | Reset --hard nhầm, xóa file | Cao |
| Sync issues | Push rejected, branch diverged | Trung bình |
| Configuration | Wrong remote URL, missing config | Thấp |
💻 Ví dụ thực hành
Lỗi 1: "Permission denied" khi push
Lỗi:
git push origin main
# ERROR: Permission to username/repo.git denied to other-user.
# fatal: Could not read from remote repository.Nguyên nhân:
- Không có quyền write vào repository
- Dùng sai tài khoản GitHub
- Personal Access Token hết hạn
Giải pháp:
# 1. Kiểm tra remote URL
git remote -v
# 2. Kiểm tra bạn có là collaborator không
# Vào GitHub → Repository → Settings → Collaborators
# 3. Nếu không có quyền, có 2 cách:
# Cách 1: Fork repository rồi push vào fork
# Cách 2: Xin quyền từ owner
# 4. Kiểm tra authentication
git config --global user.name
git config --global user.email
# 5. Tạo PAT mới nếu cần
# GitHub → Settings → Developer settings → Personal access tokensLỗi 2: "Updates were rejected" khi push
Lỗi:
git push origin main
# ! [rejected] main -> main (fetch first)
# error: failed to push some refs to 'origin'
# hint: Updates were rejected because the remote contains work that you do
# hint: not have locally.Nguyên nhân: Code trên GitHub mới hơn code local
Giải pháp:
# Bước 1: Pull code mới trước
git pull origin main
# Nếu không có conflict, Git sẽ tự động merge
# Nếu có conflict, xử lý như bình thường:
git add .
git commit -m "Merge remote-tracking branch 'origin/main'"
# Bước 2: Push lại
git push origin mainCách tránh: Luôn pull trước khi push!
Lỗi 3: Merge conflict
Lỗi:
git merge feature/login
# Auto-merging file.js
# CONFLICT (content): Merge conflict in file.js
# Automatic merge failed; fix conflicts and then commit the result.Giải pháp:
# Bước 1: Xem file conflict
git status
# Unmerged paths: file.js
# Bước 2: Mở file, tìm các dấu:
<<<<<<< HEAD
code của branch hiện tại
=======
code của branch merge vào
>>>>>>> feature/login
# Bước 3: Sửa file, giữ code đúng, xóa các dấu marker
# Bước 4: Đánh dấu đã resolve
git add file.js
git commit -m "Resolve merge conflict"Dùng tool để resolve:
- VS Code: Có UI để resolve conflict
git mergetool: Mở tool merge- GitHub: Resolve conflict trên web (nếu là PR)
Lỗi 4: "Not a git repository"
Lỗi:
git status
# fatal: not a git repository (or any of the parent directories): .gitNguyên nhân: Bạn đang ở thư mục không phải Git repository
Giải pháp:
# Kiểm tra xem có folder .git không
ls -la # macOS/Linux
dir /a # Windows
# Nếu không có, khởi tạo:
git init
# Hoặc clone repository:
git clone https://github.com/username/repo.gitLỗi 5: "fatal: bad object" hoặc corrupted repository
Lỗi:
git log
# fatal: bad object abc1234...Nguyên nhân: Repository bị corrupt (hiếm nhưng có thể xảy ra)
Giải pháp:
# Kiểm tra repository
git fsck
# Nếu có lỗi, thử recover:
git gc --prune=now
# Nếu không được, clone lại từ remote:
cd ..
rm -rf repo-name
git clone https://github.com/username/repo.gitLỗi 6: Commit nhầm vào branch sai
Tình huống: Đang ở main, commit tính năng mới (nên ở branch riêng)
Giải pháp:
# Bước 1: Tạo branch từ commit hiện tại
git branch feature/new-feature
# Bước 2: Reset main về commit trước
git reset --hard HEAD~1
# Bước 3: Chuyển sang branch mới (commit vẫn còn đó)
git checkout feature/new-featureLỗi 7: Xóa nhầm file quan trọng
Tình huống: rm important-file.js (xóa nhầm)
Giải pháp:
# Nếu chưa commit xóa:
git checkout important-file.js
# Nếu đã commit xóa, tìm lại từ commit trước:
git log --all --full-history -- important-file.js
git checkout commit-hash -- important-file.jsLỗi 8: "fatal: refusing to merge unrelated histories"
Lỗi:
git pull origin main
# fatal: refusing to merge unrelated historiesNguyên nhân: Repository local và remote không có lịch sử chung
Giải pháp:
# Cho phép merge unrelated histories
git pull origin main --allow-unrelated-histories
# Sau đó resolve conflict nếu cóLỗi 9: Push quá chậm hoặc timeout
Nguyên nhân:
- File quá lớn
- Network chậm
- Repository lớn
Giải pháp:
# Tăng buffer size
git config --global http.postBuffer 524288000
# Hoặc dùng SSH thay vì HTTPS
git remote set-url origin git@github.com:username/repo.git
# Hoặc dùng Git LFS cho file lớnLỗi 10: "fatal: ambiguous argument 'HEAD'"
Lỗi:
git reset HEAD
# fatal: ambiguous argument 'HEAD'Nguyên nhân: Repository mới, chưa có commit nào
Giải pháp:
# Tạo commit đầu tiên trước
git add .
git commit -m "Initial commit"
# Sau đó mới có thể dùng HEAD🧩 Bài tập
Level 1: Cơ bản
Bài tập 1: Thực hành xử lý conflict
- Tạo repository và commit file
app.jsvới nội dungconst x = 1; - Tạo branch
feature/A, sửa thànhconst x = 2;, commit - Quay lại
main, sửa thànhconst x = 3;, commit - Merge
feature/Avàomain - Xử lý conflict (giữ
const x = 3;) - Hoàn tất merge
Mục tiêu: Làm quen với xử lý conflict
Level 2: Nâng cao
Bài tập 2: Khôi phục code bị mất
Tạo tình huống:
- Tạo 3 commit với nội dung khác nhau
git reset --hard HEAD~2(xóa 2 commit)- Khôi phục lại bằng
git reflog - Tạo file
RECOVERY_NOTES.mdghi lại: - Cách khôi phục - Lưu ý khi dùng reset --hard - Best practices để tránh mất code
Mục tiêu: Hiểu cách khôi phục code khi gặp sự cố
💡 Mẹo & Lỗi thường gặp
Checklist trước khi push
✅ Luôn check:
git status- Xem có file nào chưa commit khônggit log --oneline -5- Xem commit message đúng chưagit diff- Xem thay đổi có đúng không- Pull trước khi push
Phòng tránh lỗi
Backup thường xuyên: - Push code lên GitHub thường xuyên - Không để code chỉ ở local quá lâu
Commit message rõ ràng: - Dễ tìm lại commit khi cần - Dễ revert nếu có lỗi
Không dùng force push:
```bash
# ⚠️ KHÔNG làm:
git push --force origin main
# Trừ khi bạn chắc chắn và đã báo team!
```
- Test code trước khi commit: - Chạy test - Kiểm tra không có console.log thừa
Khi gặp lỗi không biết xử lý
Các bước:
- Đọc error message kỹ: Thường có gợi ý
- Google error message: Rất nhiều người đã gặp
- Check Git documentation:
git help <command> - Hỏi team: Có thể họ đã gặp và biết cách xử lý
- Backup trước khi thử: Clone repository sang chỗ khác
Áp dụng vào làm việc nhóm:
- Giao tiếp: Nếu gặp lỗi, báo team biết
- Documentation: Ghi lại lỗi và cách xử lý vào team wiki
- Code review: Review code để phát hiện lỗi sớm
- Testing: Test kỹ trước khi push
Kết luận: Lỗi Git là điều không thể tránh, nhưng biết cách xử lý và phòng tránh giúp bạn làm việc hiệu quả hơn. Nhớ luôn backup code và giao tiếp với team khi gặp vấn đề!
Bài tiếp theo: 14. Tag và Release - Học cách đánh dấu version và phát hành phiên bản