Xử lý conflict
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 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-giaGit 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
<<<<<<< HEADvà=======là nội dung của nhánh đang đứng (main). - Phần giữa
=======và>>>>>>> tang-gialà 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.txtCONFLICT (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: 6000Trướ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 addrồigit commit. - Merge nhánh thường xuyên để conflict nhỏ và dễ gỡ.
Tự kiểm tra
0/3 câuNhánh A sửa Product.cs, nhánh B sửa Order.cs. Merge B vào A thì sao?
Trong file conflict, nội dung giữa <<<<<<< HEAD và ======= là của ai?
Đã sửa xong nội dung file conflict. Bước tiếp theo là gì?