Handle GIT
Trong quá trình sử dụng Git trong dự án thực tế, bạn sẽ gặp một số trường hợp đặc biệt hoặc lỗi phổ biến. Dưới đây là cách xử lý một số tình huống thường gặp, kèm theo hướng dẫn chi tiết và ngắn gọn:
1. Xung đột khi merge (Merge Conflict)
Tình huống: Khi merge branch (hoặc pull từ remote), Git báo xung đột vì cùng một đoạn mã bị sửa đổi ở cả hai branch.
Cách xử lý:
Bước 1: Git sẽ tạm dừng merge và đánh dấu các file có xung đột:
git merge <branch> # Ví dụ: CONFLICT (content): Merge conflict in file.txt
Bước 2: Mở file xung đột, tìm các đoạn được đánh dấu:
<<<<<<< HEAD Nội dung của branch hiện tại ======= Nội dung của branch được merge >>>>>>> <branch-name>
Chỉnh sửa thủ công để giữ lại nội dung mong muốn, xóa các ký hiệu
<<<<<<<
,=======
,>>>>>>>
.
Bước 3: Đánh dấu file đã giải quyết:
git add <file>
Bước 4: Hoàn tất merge:
git commit
Mẹo:
Sử dụng công cụ merge như VS Code, IntelliJ, hoặc
git mergetool
để hỗ trợ.Pull thường xuyên từ
develop
để giảm xung đột.
2. Commit nhầm file hoặc thông điệp commit sai
Tình huống: Bạn commit nhưng thêm nhầm file hoặc viết sai thông điệp.
Cách xử lý:
Sửa thông điệp commit gần nhất:
git commit --amend -m "Thông điệp mới"
Thêm file bị thiếu hoặc xóa file nhầm trong commit gần nhất:
git add <file-bi-thieu> git rm <file-nham> git commit --amend --no-edit
Lưu ý: Nếu đã push lên remote, cần force push (cẩn thận):
git push origin <branch> --force
3. Push lên remote nhưng bị từ chối (non-fast-forward)
Tình huống: Khi push, Git báo lỗi vì remote có thay đổi mà local chưa cập nhật:
! [rejected] feature/xyz -> feature/xyz (non-fast-forward)
Cách xử lý:
Bước 1: Pull thay đổi từ remote:
git pull origin <branch> --rebase
Bước 2: Giải quyết xung đột (nếu có) như mục 1.
Bước 3: Push lại:
git push origin <branch>
Mẹo: Luôn pull trước khi push để tránh lỗi này.
4. Xóa nhầm branch hoặc commit
Tình huống: Bạn vô tình xóa branch hoặc commit cần thiết.
Cách xử lý:
Khôi phục branch đã xóa:
Tìm commit hash của branch bị xóa:
git reflog
Kết quả sẽ hiển thị lịch sử thao tác, ví dụ:
abc1234 HEAD@{1}: branch: deleted feature/xyz
Tạo lại branch:
git checkout -b feature/xyz abc1234
Khôi phục commit bị xóa:
Nếu commit bị xóa do
reset
:git reflog
Tìm hash của commit bị xóa, sau đó:
git cherry-pick <commit-hash>
Hoặc khôi phục toàn bộ:
git reset --hard <commit-hash>
5. Quên merge develop trước khi tạo PR
Tình huống: Bạn đã push branch lên remote để tạo PR, nhưng quên merge mã mới nhất từ develop
, dẫn đến PR lạc hậu.
Cách xử lý:
Bước 1: Cập nhật
develop
và merge vào branch:git checkout develop git pull origin develop git checkout feature/<ten-branch> git merge develop
Bước 2: Giải quyết xung đột nếu có (xem mục 1).
Bước 3: Push lại branch:
git push origin feature/<ten-branch>
Mẹo: Nếu đã tạo PR, PR sẽ tự động cập nhật sau khi push.
6. Commit chứa thông tin nhạy cảm (API key, mật khẩu)
Tình huống: Bạn vô tình commit file chứa thông tin nhạy cảm và đã push lên remote.
Cách xử lý:
Bước 1: Xóa thông tin nhạy cảm khỏi mã:
Sửa file, xóa thông tin nhạy cảm.
Thêm file vào
.gitignore
để tránh tái phạm.
Bước 2: Viết lại lịch sử commit:
Sử dụng
git filter-branch
hoặc công cụ nhưbfg
:git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch <file-chua-bi-mat>' \ --prune-empty --tag-name-filter cat -- --all
Hoặc dùng BFG Repo-Cleaner (dễ hơn):
bfg --delete-files <file-chua-bi-mat>
Bước 3: Force push để cập nhật remote:
git push origin --force --all
Bước 4: Thông báo team để pull lại mã mới và thay đổi thông tin nhạy cảm (như API key).
7. Branch local lạc hậu so với remote
Tình huống: Branch local của bạn không đồng bộ với remote sau khi đồng nghiệp merge PR.
Cách xử lý:
Cập nhật branch local:
git fetch origin git checkout <branch> git reset --hard origin/<branch>
Tiếp tục làm việc hoặc tạo branch mới từ
develop
.
8. PR quá lớn, khó review
Tình huống: Bạn tạo PR với quá nhiều thay đổi, khiến đồng nghiệp khó kiểm tra.
Cách xử lý:
Chia nhỏ commit:
Sử dụng
git rebase -i
để chỉnh sửa lịch sử commit:git rebase -i <commit-hash>
Chia commit lớn thành các commit nhỏ hơn với
edit
.
Hoặc tạo branch mới cho từng phần nhỏ:
git checkout -b feature/<phần-1> git add . git commit -m "Phần 1: ..." git push origin feature/<phần-1>
Tạo nhiều PR cho từng tính năng nhỏ.
Mẹo: Thảo luận với team trước khi làm tính năng lớn để chia task hợp lý.
9. Lỡ force push gây mất mã của team
Tình huống: Bạn force push nhầm lên branch chung (develop
, main
), làm mất commit của đồng nghiệp.
Cách xử lý:
Bước 1: Tìm lịch sử commit bị mất:
git reflog
Xác định hash của commit trước khi force push.
Bước 2: Khôi phục commit:
git checkout <branch> git reset --hard <commit-hash> git push origin <branch> --force
Bước 3: Thông báo team ngay lập tức và xin lỗi, đảm bảo mọi người pull lại mã.
Mẹo: Tránh force push trên branch chung, hoặc bật bảo vệ branch trên GitHub/GitLab.
10. Không thể push vì dung lượng file lớn
Tình huống: Bạn commit file lớn (như dataset, video), Git từ chối push.
Cách xử lý:
Bước 1: Xóa file lớn khỏi commit:
git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch <ten-file-lon>' \ --prune-empty --tag-name-filter cat -- --all
Bước 2: Sử dụng Git LFS (Large File Storage) nếu cần:
git lfs install git lfs track "<ten-file-lon>" git add .gitattributes git add <ten-file-lon> git commit -m "Add large file with LFS" git push origin <branch>
Bước 3: Push lại:
git push origin <branch> --force
Mẹo: Thêm file lớn vào
.gitignore
và lưu trữ trên cloud (Google Drive, S3).
Lời khuyên chung
Backup thường xuyên: Tạo branch dự phòng trước khi thực hiện thao tác nguy hiểm (rebase, force push).
Giao tiếp với team: Thông báo khi làm thay đổi lớn hoặc gặp lỗi nghiêm trọng.
Học từ lỗi: Ghi chú các tình huống đã gặp để xử lý nhanh hơn lần sau.
Sử dụng công cụ: VS Code, SourceTree, hoặc GitKraken giúp trực quan hóa Git.
Last updated