Giao diện
3. Giải quyết Conflict (Xung đột)
IMPORTANT
MINDSET: Conflict là chuyện cơm bữa. Đừng sợ nó. Nó chỉ là Git đang hỏi bạn: "Cả 2 người cùng sửa dòng 10. Tôi nên chọn cái nào?".
3.1 Nhận diện Conflict
Khi bạn merge hoặc rebase, nếu Git thấy cùng một dòng code bị sửa bởi 2 người khác nhau, nó sẽ dừng lại và la lên: CONFLICT (content): Merge conflict in file.txt
Lúc này, mở file bị conflict lên, bạn sẽ thấy các dấu hiệu này:
text
<<<<<<< HEAD
Code hiện tại của bạn (trên máy local)
console.log("Hello Vietnam");
=======
Code mới từ server (của đồng nghiệp)
console.log("Xin Chao Vietnam");
>>>>>>> feature/language-update<<<<<<<: Bắt đầu vùng xung đột.=======: Đường phân chia.>>>>>>>: Kết thúc vùng xung đột.
3.2 Cách xử lý (Fearless Resolution)
Bạn có 3 lựa chọn logic:
- Giữ code của mình (Current Change).
- Lấy code của họ (Incoming Change).
- Kết hợp cả hai (Both).
Công cụ hỗ trợ
Đừng sửa thủ công bằng cách xóa các dấu <<< === >>>. Rất dễ sai sót.
Dùng VS Code: VS Code tự động phát hiện conflict và hiện các nút bấm ngay trên dòng code: Accept Current Change | Accept Incoming Change | Accept Both Changes
Quy trình chuẩn:
- Bấm chọn nút phù hợp cho từng file.
- Lưu file lại.
- Chạy
git add .để đánh dấu đã sửa xong. - Chạy
git commit(nếu đang merge) hoặcgit rebase --continue(nếu đang rebase).
TIP
HPN's Advice: Nếu conflict quá phức tạp (hàng trăm dòng), đừng đoán mò. Hãy gọi trực tiếp người đồng nghiệp đã viết đoạn code kia (xem git blame) để cùng ngồi quyết định (Pair Review). Code sai logic nguy hiểm hơn Code lỗi syntax.
🧠 Quiz
Câu 1: Conflict markers trong Git bao gồm những ký hiệu nào?
- [ ] A)
{{{,|||,}}} - [x] B)
<<<<<<<,=======,>>>>>>> - [ ] C)
>>>,===,<<< - [ ] D)
START,MIDDLE,END
💡 Giải thích: Git đánh dấu vùng xung đột bằng
<<<<<<<(bắt đầu - code của bạn),=======(đường phân chia),>>>>>>>(kết thúc - code incoming). Nội dung giữa các markers cần được giải quyết.
Câu 2: Khi gặp conflict phức tạp (hàng trăm dòng), cách xử lý tốt nhất là gì?
- [ ] A) Chọn "Accept Current Change" cho tất cả
- [ ] B) Chọn "Accept Incoming Change" cho tất cả
- [ ] C) Xóa hết code conflict và viết lại từ đầu
- [x] D) Dùng
git blameđể tìm tác giả và cùng họ Pair Review để quyết định
💡 Giải thích: Với conflict phức tạp, đừng đoán mò. Dùng
git blamexác định ai viết đoạn code, rồi ngồi cùng họ quyết định. Code sai logic nguy hiểm hơn code lỗi syntax nhiều.
Câu 3: Sau khi resolve tất cả conflicts, quy trình tiếp theo là gì?
- [ ] A) Chạy
git pushngay lập tức - [ ] B) Chạy
git conflict --resolve - [x] C) Chạy
git add .rồigit commit(merge) hoặcgit rebase --continue(rebase) - [ ] D) Chạy
git merge --continuetrong mọi trường hợp
💡 Giải thích: Sau khi sửa conflict, cần
git addđể đánh dấu file đã resolved. Nếu đang merge thìgit commit, nếu đang rebase thìgit rebase --continue. Quy trình khác nhau tùy context.