Skip to content

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:

  1. Giữ code của mình (Current Change).
  2. Lấy code của họ (Incoming Change).
  3. 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:

  1. Bấm chọn nút phù hợp cho từng file.
  2. Lưu file lại.
  3. Chạy git add . để đánh dấu đã sửa xong.
  4. Chạy git commit (nếu đang merge) hoặc git 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 blame xá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 push ngay lập tức
  • [ ] B) Chạy git conflict --resolve
  • [x] C) Chạy git add . rồi git commit (merge) hoặc git rebase --continue (rebase)
  • [ ] D) Chạy git merge --continue trong 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.