VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Kiến trúc và chất lượng codeGit
Bài 3/17
5 phút

Xử lý conflict

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Hai người cùng sửa giá Bút bi, mỗi người trên một nhánh: một người ghi 5500, người kia ghi 6000. Tới lúc merge, Git không biết nên giữ giá nào. Đó là conflict, và người merge phải tự chọn.

Khái niệm

⚔️ Conflict (xung đột): tình huống hai nhánh cùng sửa một chỗ trong một file, nên Git dừng merge và đánh dấu chỗ đó để bạn tự chọn nội dung.

Hai nhánh sửa hai file khác nhau, hoặc hai chỗ xa nhau trong cùng một file, thì Git tự gộp được. Conflict chỉ xảy ra khi cùng một dòng, hoặc các dòng sát nhau, bị sửa ở cả hai nhánh.

Ví dụ

Trên main, prices.txt có dòng Bút bi: 5000. Nhánh tang-gia sửa thành 6000, còn main sửa thành 5500:

git switch -c tang-gia
# sửa "Bút bi: 5000" thành "Bút bi: 6000"
git commit -am "Tăng giá Bút bi"
git switch main
# sửa "Bút bi: 5000" thành "Bút bi: 5500"
git commit -am "Giá Bút bi 5500"
git merge tang-gia

Git dừng merge giữa chừng. Mở prices.txt sẽ thấy:

<<<<<<< HEAD
Bút bi: 5500
=======
Bút bi: 6000
>>>>>>> tang-gia
Vở: 12000
Thước: 7000
  • Phần giữa <<<<<<< HEAD và ======= là nội dung của nhánh đang đứng (main).
  • Phần giữa ======= và >>>>>>> tang-gia là nội dung của nhánh được merge vào (tang-gia).
  • Các dòng khác không bị hai nhánh cùng sửa nên Git đã tự gộp.

Để giải quyết, sửa file thành nội dung muốn giữ, xoá cả ba dòng đánh dấu, rồi chạy:

git add prices.txt
git commit -m "Merge tang-gia, chốt giá 6000"

Thử ngay

Tiếp tục với prices.txt của bài trước, chạy các lệnh trong ví dụ tới git merge tang-gia. Sau đó chạy thêm lệnh in trạng thái mỗi file trên một dòng:

git status --short

Đoán trước khi chạy: git merge in ra gì, và git status --short báo gì về prices.txt?

Xem kết quả
Auto-merging prices.txt
CONFLICT (content): Merge conflict in prices.txt
Automatic merge failed; fix conflicts and then commit the result.

UU prices.txt

CONFLICT (content) là conflict trong nội dung file. UU nghĩa là cả hai nhánh cùng sửa file này và conflict chưa được giải quyết. Merge đang dừng giữa chừng, chờ bạn sửa file, git add và git commit.

Lỗi hay gặp

Commit mà quên xoá dòng đánh dấu. Git vẫn cho commit, nhưng file giờ chứa <<<<<<< và =======. Nếu đó là file .cs thì project không build được nữa.

# SAI — còn nguyên dấu conflict
<<<<<<< HEAD
Bút bi: 5500
=======
Bút bi: 6000
>>>>>>> tang-gia
# ĐÚNG — chỉ giữ nội dung đã chốt
Bút bi: 6000

Trước khi git add, chạy git diff --check: còn sót dấu conflict thì Git báo leftover conflict marker kèm số dòng.

Tóm tắt

  • Conflict xảy ra khi hai nhánh cùng sửa một chỗ trong một file.
  • Git đánh dấu bằng <<<<<<<, =======, >>>>>>>: phía trên là nhánh đang đứng, phía dưới là nhánh đang merge vào.
  • Sửa file cho đúng, xoá dấu, git add rồi git commit.
  • Merge nhánh thường xuyên để conflict nhỏ và dễ gỡ.

Tự kiểm tra

0/3 câu
Câu 1

Nhánh A sửa Product.cs, nhánh B sửa Order.cs. Merge B vào A thì sao?

Câu 2

Trong file conflict, nội dung giữa <<<<<<< HEAD và ======= là của ai?

Câu 3

Đã sửa xong nội dung file conflict. Bước tiếp theo là gì?

Branch và mergeGitHub và pull request

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt