Domain 3 · 9 phút đọc

Xử lý merge conflict

Handling Merge Conflicts

Conflict là nỗi sợ của nhiều người mới dùng Git, nhưng thực ra nó rất logic. Khi hiểu Git đang hỏi gì, bạn sẽ thấy giải quyết xung đột (conflict) merge conflict chỉ là việc chọn nội dung đúng.

Vì sao có conflict?

Khi làm 3-way merge three-way merge, Git tự gộp được phần lớn thay đổi. Nhưng nếu hai branch sửa cùng một dòng (hoặc vùng dòng) trong cùng một file theo hai cách khác nhau, Git không thể tự quyết nên giữ phiên bản nào.

Lúc đó Git dừng giữa chừng quá trình merge, đánh dấu các chỗ mâu thuẫn ngay trong file và giao lại cho bạn quyết định. Conflict không phải lỗi — nó là Git xin ý kiến con người.

Đọc conflict markers

Git chèn ba loại dấu vào file đang conflict. Phần giữa <<<<<<<======= là nội dung của branch hiện tại (HEAD); phần giữa =======>>>>>>> là nội dung của branch đang gộp vào:

<<<<<<< HEAD
const greeting = "Xin chao";
=======
const greeting = "Hello";
>>>>>>> feature

Việc của bạn là sửa đoạn đó thành nội dung cuối cùng đúng, rồi xóa cả ba dòng dấu (<<<<<<<, =======, >>>>>>>). Ví dụ bạn quyết định giữ bản tiếng Việt thì kết quả còn lại:

const greeting = "Xin chao";

Quy trình giải quyết

Sau khi sửa xong tất cả các file conflict, dùng git add để báo cho Git biết chỗ đó đã được giải quyết, rồi hoàn tất merge:

# Merge bị dừng vì conflict — xem file nào đang conflict
git status

# Sửa từng file, xóa hết conflict markers, rồi add
git add src/greeting.js

# Khi đã add hết các file conflict, hoàn tất merge
git merge --continue

git merge --continue sẽ mở trình soạn thảo cho merge commit (hoặc bạn dùng git commit đều được).

Đừng quên xóa markers

Lỗi rất hay gặp là git addquên xóa dòng <<<<<<< / ======= / >>>>>>>. Khi đó các ký tự rác này lọt vào code và thường gây lỗi biên dịch. Luôn kiểm tra lại file trước khi add.

Hủy merge khi rối

Nếu giữa chừng bạn thấy rối và muốn quay về trạng thái trước khi merge, dùng:

git merge --abort

Lệnh này hủy toàn bộ quá trình merge và đưa cây làm việc về đúng như trước khi bạn chạy git merge. An toàn để bắt đầu lại.

Tình huốngLệnh
Xem file nào đang conflictgit status
Đánh dấu một file đã giải quyếtgit add <file>
Hoàn tất merge sau khi giải quyết hếtgit merge --continue
Hủy merge, quay về trước khi gộpgit merge --abort

Trọng tâm thi

Đề hỏi về cách thoát một merge đang conflict mà chưa muốn giải quyết → git merge --abort. Để hoàn tất sau khi sửa: git add các file đã giải quyết rồi git merge --continue.

Tóm tắt

  • Conflict xảy ra khi hai branch sửa cùng một chỗ trong cùng file → Git nhờ bạn quyết định.
  • Đọc markers: <<<<<<< HEAD là branch hiện tại, >>>>>>> branch là branch đang gộp vào, ngăn bởi =======.
  • Sửa file, xóa hết markers, git add rồi git merge --continue.
  • Muốn hủy giữa chừng: git merge --abort đưa về trạng thái trước khi merge.