HocTotGit.io

Git cơ bản (Fundamentals)
  • Version Control là gì?
  • Git là gì?
  • Cài đặt và cấu hình Git
  • Quiz
  • Thuật ngữ cốt lõi
  • Tạo repository
  • Theo dõi file
  • Quy trình commit
  • Quiz
  • Kiểm tra log
  • Hủy thay đổi
  • Cập nhật commit
  • Quiz
  • Lý thuyết về nhánh
  • Tạo và chuyển nhánh
  • Merge nhánh
  • Giải quyết merge conflict
  • Quiz
Liên kết
Blog
Hỗ trợ

Email: work.lamsun@gmail.com

Yêu thích nền tảng

Hãy chia sẻ ý kiến của bạn

HocTotGit.io

© 2026 HocTotGit.

Giải quyết merge conflict

Trong quá trình merge, không phải lúc nào mọi thứ cũng diễn ra suôn sẻ. Khi hai nhánh cùng sửa đổi một phần của file, Git sẽ không thể tự quyết định nên giữ lại thay đổi nào - và đó là lúc Merge Conflict xuất hiện. Bài học này sẽ giúp bạn hiểu rõ nguyên nhân và cách xử lý xung đột một cách hiệu quả.


1. Tại sao xảy ra Merge Conflicts?

Trong quá trình làm việc, các branch có thể tách ra thành những nhánh phát triển song song trong commit tree. Khi đó, các commit thường được thêm mới ở cả hai nhánh cùng một lúc. Vấn đề nảy sinh khi cả hai branch cùng sửa đổi chung một file.

Nếu cả hai branch cùng sửa đổi chung một vị trí trong file, Git sẽ gặp khó khăn vì nó không biết nên chọn phiên bản sửa đổi nào. Merge conflicts xảy ra khi Git cần sự can thiệp từ phía người dùng (là bạn) để hoàn tất việc merge.


2. Lỗi "False Start"

Thậm chí trước khi thao tác merge có thể bắt đầu, Git có thể báo lỗi ngay lập tức nếu trong working directory của bạn đang có những thay đổi untracked mà có nguy cơ bị ghi đè bởi lệnh merge. Nếu gặp trường hợp này, bạn sẽ thấy thông báo sau:

error: Your local changes to the following files would be overwritten by merge:
    index.html
Please commit your changes or stash them before you merge.

hoặc

error: The following untracked working tree files would be overwritten by merge:
    _includes/newsletter_signup.html
Please move or remove them before you merge.
Aborting
Merge with strategy ort failed.

Khi điều này xảy ra, Git chưa thể bắt đầu quy trình merge. Để khắc phục, bạn bắt buộc phải xử lý bằng cách commit hoặc stash các file được nhắc trong thông báo trước khi có thể tiến hành merge.


3. Cách xử lý merge conflict

Sau khi đã xử lý xong lỗi False Start ở trên, bạn có thể bắt đầu thực hiện việc merge, và các merge conflict có thể xảy ra tại đây. Khi gặp loại conflict này, Git thực sự đã bắt đầu thao tác merge nhưng buộc phải tạm dừng giữa chừng vì không thể tự giải quyết.

Bạn sẽ thấy thông báo như sau:

CONFLICT (content): Merge conflict: ...
CONFLICT (modify/delete): Merge conflict: ...
Automatic merge failed; fix conflicts then commit

Trong ví dụ này, chúng ta cố gắng merge nhánh widgets vào nhánh main bằng lệnh git merge widgets, nhưng xung đột đã xảy ra. Hãy làm theo các bước dưới đây để giải quyết.

(Optional) Hủy bỏ Merge

Nếu bạn cảm thấy quá rối hoặc chưa có thời gian để sửa conflict ngay, hãy dùng lệnh abort để hủy bỏ thao tác merge. Lệnh này sẽ đưa repository của bạn quay về trạng thái trước khi merge.

git merge --abort
Lưu ý quan trọng:

Sau khi nhận được thông báo merge conflict, bạn bắt buộc phải hoàn thành tất cả các bước bên dưới hoặc hủy bỏ (abort) nó. Đừng cố gắng làm việc khác hoặc sửa file khác cho đến khi conflict được giải quyết hoặc bị hủy bỏ.


3.1. Xác định file bị xung đột

Các branch tham gia merge có thể chứa hàng tá commit và file, nhưng hiếm khi tất cả chúng đều bị lỗi. Để tìm ra chính xác file nào đang bị conflict, hãy chạy:

git status

Output:

On branch main
You have unmerged paths...

Changes to be committed:
    new file:   _includes/newsletter_signup.html
    deleted:    _posts/welcome.markdown
    modified:   index.html

Unmerged paths:
    both modified:   _layouts/page.html
    deleted by us:   about.md
  • Các file nằm dưới mục Changes to be committed: Là các file an toàn, Git đã tự gộp xong.

  • Các file nằm dưới mục Unmerged paths: Đây là các file cần bạn can thiệp, trong ví dụ này là _layouts/page.html và about.md.

Các loại xung đột thường gặp:

  • deleted by us hoặc deleted by them: File tồn tại ở branch này nhưng bị xóa ở branch kia.

  • both modified: File bị sửa đổi bởi cả hai branch và Git không biết nên chọn phiên bản nào.

3.2. Sửa file bị xung đột

Hãy mở (các) file bị both modified bằng trình soạn thảo văn bản của bạn. Tiếp theo, hãy tìm các conflict markers bắt đầu bằng <<<<<<< mà Git đã thêm vào.

Những dấu hiệu này chỉ ra vị trí cụ thể mà Git không thể tự giải quyết.

  • Phần trên cùng (HEAD) là nội dung của nhánh hiện tại (main).

  • Phần dưới cùng là nội dung của nhánh đang muốn gộp vào (widgets).

  • Chúng được ngăn cách bởi dấu =====.

Cấu trúc sẽ trông như thế này:

<<<<<<< HEAD
  Changes introduced by the main branch (Code của nhánh Main)
======
  Changes introduced by the widgets branch (Code của nhánh Widgets)
>>>>>>> widgets

Nhiệm vụ của bạn là xóa bỏ thủ công các dòng đánh dấu (<<<, ===, >>>) và thay thế toàn bộ khối đó bằng đoạn code cuối cùng mà bạn muốn giữ lại (có thể là code của main, code của widgets, hoặc kết hợp cả hai).

Sau khi sửa xong, thực hiện lưu file và lặp lại quy trình này cho tất cả các file both modified được xác định ở bước 1.

3.3. Đánh dấu đã giải quyết

Sau khi sửa xong nội dung file, đã đến lúc đưa chúng vào staging area để hoàn tất merge.

Đối với các file bị deleted by us hoặc deleted by them, hãy chọn giữ hay xóa file:

# Nếu muốn GIỮ lại file đó
git add <filename(s)>

# Nếu muốn XÓA bỏ file đó
git rm <filename(s)>

Đối với các file both modified (file bạn vừa sửa thủ công ở bước 2), luôn sử dụng lệnh:

git add <filename(s)>

3.4. Kiểm tra lại

Để chắc chắn rằng mọi xung đột đã được xử lý xong, hãy dùng lệnh git status để kiểm tra lại Output:

On branch main
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)
...

Nếu bạn thấy dòng chữ: "All conflicts fixed but you are still merging" (Mọi xung đột đã sửa xong nhưng bạn vẫn đang trong quá trình merge) thì tức là bạn đã hoàn tất việc giải quyết xung đột. Git gợi ý bước tiếp theo cho bạn là commit lại để hoàn tất merge.

3.5. Hoàn tất Merge

Cuối cùng chúng ta có thể hoàn tất việc merge bằng cách tạo merge commit thủ công:

git commit -m 'Fixed merge conflicts and merged widgets branch'

Sau khi chạy lệnh này, bạn đã hoàn thành!


Tổng kết

Các bước để giải quyết merge conflict trong Git gồm: Xác định file bị conflict với lệnh git status → sửa file bị conflict → đánh dấu đã giải quyết bằng lệnh git add hoặc git rm → kiểm tra lại với lệnh git status để đảm bảo "All conflicts fixed" → hoàn tất merge bằng lệnh git commit

Hy vọng bạn đã hiểu và nắm vững cách giải quyết merge conflict trong Git. Hãy thử sức với bài quiz cho chương này nhé!

Tiếp theo: Quiz