Hướng dẫn tự học Git và Github từ cơ bản đến nâng cao

Conflict trong Git Hướng dẫn học Git Aptech Buôn Ma Thuột

Bài 7: Git conflicts? Cách xử lý conflict trong khi merge.

Git là công cụ làm việc nhóm hiệu quả, nó kiểm soát và quản lý rất tốt các đóng góp cho nội dung dự án giữa nhiều tác giả (thường là nhà phát triển). Đôi khi nhiều nhà phát triển có thể cố gắng chỉnh sửa cùng một nội dung. Nếu nhà phát triển A cố gắng chỉnh sửa mã mà Nhà phát triển B đang chỉnh sửa thì có thể xảy ra xung đột conflict.
Trong bài này, chúng ta sẽ cùng tìm hiểu khái niệm conflict trong git và học cách giải quyết conflict khi thực hiện hợp nhất merge đơn giản nhất.

Conflict trong Git là gì?

Như đã nói ở trên, conflict nghĩa là xung đột. Trong một hệ thống kiểm soát nguồn như Git, xung đột có thể xảy ra khi hai hoặc nhiều người thay đổi cùng một tệp. Các xung đột có thể xuất hiện tại kho lưu trữ cục bộ của thành viên hoặc kho lưu trữ từ xa Github.
Ví dụ dưới đây cho thấy xung đột có thể xảy ra khi 2 branch dev_a dev_b cùng làm việc trong một dự án. Xung đột xảy ra khi dev_a và dev_b cố gắng merge mã mới vào master mà không cập nhật các thay đổi từ nhau.
 
git conflict huong dan git aptech buon ma thuot 1467x357

Ở biểu đồ trên, 2 nhánh dev_a và dev_b cùng thao tác trên một file là person.java.
- Đầu tiên dev_b thay đổi nội dung tại các dòng 1 và 2 của file person.java và thực hiện commit C2 để ghi lại các thay đổi đó.
- Sau đó dev_b merge các thay đổi này vào nhánh master ở commit C3.
- Song song đó, dev_a cũng thay đổi nội dung tại các dòng 1,2,3 và 4 của file person.java và thực hiện 2 commit là C4 C5 để ghi lại các thay đổi của mình
- Sau đó, dev_a cũng thực hiện lệnh hợp nhất merge để cập nhật các commit C4 C5 vào nhánh master như commit C6.
- Lúc này, xung đột conflict sẽ diễn ra. Do Git nhận thấy nội dung trên mỗi dòng của file person.java là không giống nhau tại 2 phiên bản chuẩn bị hợp nhất. Nghĩa là tại thời điểm merge branch dev_a vào master thì nội dung của file person.java trên dev_a có sự không đồng nhất với nội dung trên file person.java của nhánh master (Git so sánh từng dòng trong file, để theo dõi sự thay đổi của file đó). Cụ thể: như biểu đồ trên thì xung đột bắt đầu từ dòng số 2.

Lưu ý: Xung đột chỉ ảnh hưởng đến nhà phát triển trong quá trình tiến hành hợp nhất, phần còn lại của nhóm (nghĩa là những người không tham gia vào quá trình thay đổi file này) sẽ không biết gì về xung đột. Nguyên tắc đưa ra, ai gây ra xung đột người đó sẽ chủ động giải quyết trước ^^!

Giải quyết xung đột conflict trong Git khi thực hiện hợp nhất merge như thế nào?

Lại quay trở lại ví dụ trên, Git không thể tự động xác định điều gì là đúng, nó đâu thể biết được nội dung trong file như thế nào là đúng theo ý muốn của người viết. Git sẽ đánh dấu file bị xung đột và tạm dừng quá trình hợp nhất. Sau đó, trách nhiệm của các nhà phát triển là giải quyết xung đột dựa trên những gì Git đã đánh dấu.

Ở đây, Git sẽ trực tiếp thêm vào một số từ khóa vào trong file person.java (như bên dưới) để nhà phát triển có thể xem xét và quyết định thay đổi của mình.
1......<<<<<<< HEAD=======2......3......>>>>>>> dev_a4......
Có thể hiểu những dòng mới trong file person.java này là "Conflict deviders" bộ chia xung đột. Trong đó: 
+ Đầu tiên, dòng "<<<<<<< HEAD" là nội dung tồn tại trong nhánh master hiện tại mà tham chiếu HEAD đang trỏ tới.
+ Thứ hai, tất cả nội dung phía sau dòng "=======" là "trung tâm" của cuộc xung đột. Thể hiện nội dung xung đột. 
+ Thứ ba, tất cả nội dung phía sau dòng ">>>>>>> dev_a" là nội dung có trong nhánh dev_a chuẩn bị hợp nhất vào master.

Như vậy, sau khi đã xác định nội dung xung đột. Cách trực tiếp nhất để giải quyết xung đột hợp nhất là chỉnh sửa tệp bị xung đột. Mở file person.java trong trình soạn thảo yêu thích của bạn. Ví dụ ở đây tôi chỉ cần loại bỏ tất cả các bộ chia xung đột bằng cách xóa nó đi. Nội dung file person.java được sửa đổi sẽ trông như sau:
1......2......3......4......
Bước tiếp theo là thực hiện git add để tạo nội dung hợp nhất mới và để hoàn tất việc hợp nhất, hay sử dụng git commit để tạo một cam kết mới cho kho lưu trữ.

Tổng kết:
- Để giải quyết xung đột conflict trong git, rất đơn giản là chỉnh sửa nội dung trên file mà nó dẫn tới xung đột, sau đó thực hiện add, commit cho file đó.
- Để giảm thiểu xung đột trong một nhóm có nhiều thành viên, bạn nên xác định một quy trình ngay từ đầu để tất cả các thành viên trong nhóm làm việc trên cùng một dự án được biết khi sử dụng Git. Dưới đây là một số gợi ý để làm việc hiệu quả hơn:
+ Cam kết thường xuyên: đừng đợi cho đến khi bạn có một lượng lớn các tập lệnh được tạo để commit và push chúng vào kho lưu trữ từ xa Git. Tập lệnh nhỏ hơn được push, bạn càng dễ giải quyết xung đột.
+ Nên pull các thay đổi từ kho lưu trữ từ xa Git trước khi làm việc trên các tập lệnh mới và trước khi commit.
+ Mỗi thành viên nên làm việc trên từng tính năng trong các nhánh riêng biệt tại một thời điểm.

Tác giả bài viết: Aptech Buôn Ma Thuột

Ý kiến bạn đọc

Tham gia thảo luận

Mã an toàn Mã bảo mật   

Những tin cũ hơn

Bài 6: Gitignore là gì? Sử dụng .gitignore sao cho hiệu quả nhất?
Bài 5:Một số vấn đề thường gặp khi sử dụng Git và cách khắc phục
Bài 4: Hướng dẫn sử dụng Git - Các lệnh cơ bản cần phải biết
Bài 3: Cách sử dụng Github và làm việc nhóm bằng GitHub
Bài 2: Hướng dẫn cài đặt Git trên Windows và Linux
Bài 1: Git là gì? Cùng khám phá công cụ kiểm soát phiên bản phân tán.