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 <<<<<<< và ======= là nội dung của branch hiện tại (HEAD); phần giữa ======= và >>>>>>> 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 add mà quê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ống | Lệnh |
|---|---|
| Xem file nào đang conflict | git status |
| Đánh dấu một file đã giải quyết | git add <file> |
| Hoàn tất merge sau khi giải quyết hết | git merge --continue |
| Hủy merge, quay về trước khi gộp | git 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:
<<<<<<< HEADlà branch hiện tại,>>>>>>> branchlà branch đang gộp vào, ngăn bởi=======. - Sửa file, xóa hết markers,
git addrồigit merge --continue. - Muốn hủy giữa chừng:
git merge --abortđưa về trạng thái trước khi merge.