Giới thiệu về xung đột merge

Khi làm việc trong một dự án đa người, việc merge nhánh thường dẫn đến xung đột (conflict) nếu cùng một phần của file được chỉnh sửa trên các nhánh khác nhau. Xung đột không phải là lỗi, mà là cơ chế bảo vệ để người dùng quyết định cách hợp nhất thay đổi.

Quy trình phát hiện xung đột

Git sẽ tự động phát hiện xung đột khi thực hiện lệnh git merge hoặc git rebase. Khi có xung đột, quá trình dừng lại và các file bị ảnh hưởng sẽ được đánh dấu bằng các ký hiệu đặc biệt:

<!-- file example.txt -->
<div>Version A</div>
<<<<<< HEAD
<div>Thay đổi từ nhánh develop</div>
=======
<div>Thay đổi từ nhánh feature-x</div>
>>>>>> feature-x
</div>

Những dòng <<<<<< HEAD, =======, >>>>>> feature-x xác định phần nội dung của mỗi nhánh.

Bước 1: Kiểm tra danh sách file xung đột

Sử dụng lệnh sau để liệt kê các file đang có xung đột:

git status --short

Kết quả sẽ hiển thị các file với trạng thái UU (both modified).

Bước 2: Mở file và quyết định cách hợp nhất

Trong mỗi file, bạn cần chọn một trong ba cách:

  • Giữ thay đổi của nhánh hiện tại (keep HEAD).
  • Áp dụng thay đổi của nhánh được merge (keep feature-x).
  • Kết hợp thủ công bằng cách viết lại nội dung sao cho đáp ứng yêu cầu nghiệp vụ.

Sau khi chỉnh sửa, xóa các ký hiệu <<<<<<, =======, >>>>>>.

Bước 3: Đánh dấu xung đột đã được giải quyết

Sau khi lưu lại, chạy lệnh:

git add file

hoặc dùng git add -u để thêm tất cả các file đã sửa.

Bước 4: Hoàn thành merge hoặc rebase

Nếu đang thực hiện merge, thực hiện:

git commit -m "Resolve merge conflict between develop and feature-x"

Đối với rebase, tiếp tục quá trình bằng:

git rebase --continue

Chiến lược phòng ngừa xung đột

Mặc dù không thể tránh hoàn toàn, bạn có thể giảm thiểu xung đột bằng một số thực hành:

  • Thường xuyên sync nhánh: Pull và rebase nhánh feature lên develop trước khi mở Pull Request.
  • Sử dụng quy tắc bảo vệ nhánh: Yêu cầu review và CI trước khi merge vào main hoặc develop.
  • Chia nhỏ commit: Mỗi commit nên tập trung vào một thay đổi logic, giúp công cụ tự động phát hiện xung đột dễ dàng hơn.

Kết luận

Hiểu rõ cách Git đánh dấu và giải quyết xung đột giúp bạn duy trì lịch sử commit sạch sẽ và giảm thời gian debug. Khi gặp xung đột, hãy tuân thủ quy trình kiểm tra, chỉnh sửa, và commit lại một cách có hệ thống.

Để nâng cao kỹ năng quản lý quy trình Git và Git Flow, Tham khảo khóa học "Khóa học Git & Git Flow thực chiến" tại đây.