Git conflicts? Cách xử lý conflict trong khi merge.

Git conflicts

Git conflicts? Cách xử lý conflict trong khi merge.

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

Conflict trong Git là gì?

Như đã đề cập, Git conflicts nghĩa là xung đột trong Git. Trong hệ thống kiểm soát nguồn như Git, xung đột xảy ra khi hai hoặc nhiều người thay đổi cùng một tệp. 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 trên GitHub.

Ví dụ sau minh họa xung đột khi hai nhánh dev_a và 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 hợp nhất mã mới vào master mà không cập nhật các thay đổi từ nhau.

Trong biểu đồ trên, hai nhánh dev_a và dev_b cùng chỉnh sửa tệp person.java.

Đầu tiên, dev_b thay đổi nội dung tại dòng 1 và 2 của tệp person.java và thực hiện commit C2 để ghi lại các thay đổi đó. Sau đó, dev_b hợp nhất các thay đổi này vào nhánh master ở commit C3.

Song song đó, dev_a thay đổi nội dung tại dòng 1, 2, 3 và 4 của tệp person.java và thực hiện hai commit là C4 và 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 để cập nhật các commit C4 và C5 vào nhánh master như commit C6.

Lúc này, xung đột xảy ra. Git nhận thấy nội dung trên mỗi dòng của tệp person.java không giống nhau ở hai phiên bản chuẩn bị hợp nhất. Tại thời điểm merge branch dev_a vào master, nội dung của tệp person.java trên dev_a không đồng nhất với nội dung trên tệp person.java của nhánh master. Cụ 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 hợp nhất. Phần còn lại của nhóm, những người không tham gia vào quá trình thay đổi tệp này, sẽ không biết về xung đột. Nguyên tắc là ai gây ra xung đột người đó sẽ chủ động giải quyết.

Conflict trong Git là gì?

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

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

Git sẽ thêm một số từ khóa vào tệp person.java để nhà phát triển xem xét và quyết định thay đổi của mình.

Ví dụ:
1……<<<<<<< HEAD=======2……3……>>>>>>> dev_a4……

Các dòng mới trong tệp person.java là “Conflict dividers” (bộ chia xung đột). Trong đó:

  • Dòng `<<<<<<< HEAD` là nội dung hiện có trong nhánh master mà HEAD đang trỏ tới.
  • Phần sau dòng `=======` là “trung tâm” của xung đột, thể hiện nội dung xung đột.
  • Phần sau dòng `>>>>>>> dev_a` là nội dung trong nhánh dev_a chuẩn bị hợp nhất vào master.

Sau khi xác định nội dung xung đột, cách giải quyết xung đột hợp nhất là chỉnh sửa tệp bị xung đột. Mở tệp person.java trong trình soạn thảo yêu thích và loại bỏ các bộ chia xung đột. Nội dung tệp person.java sau khi 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à sử dụng `git commit` để tạo một cam kết mới cho kho lưu trữ, hoàn tất việc hợp nhất.

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

Tổng kết

Để giải quyết Git conflicts, bạn chỉ cần chỉnh sửa nội dung trong tệp gây xung đột và sau đó thực hiện `add` và `commit` cho tệp đó.

Để giảm thiểu xung đột trong một nhóm có nhiều thành viên, nên thiết lập một quy trình từ đầu để tất cả các thành viên trong nhóm biết khi làm việc với Git trên cùng một dự án. Dưới đây là một số gợi ý để làm việc hiệu quả hơn:

  • Thực hiện commit thường xuyên: không chờ đợi cho đến khi có quá nhiều thay đổi để commit và push vào kho lưu trữ từ xa Git. Việc commit thường xuyên giúp dễ dàng hơn trong việc giải quyết xung đột.
  • Trước khi làm việc trên các thay đổi mới và commit, nên pull các thay đổi từ kho lưu trữ từ xa Git.
  • 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 vào một thời điểm.

giải quyết Git conflicts

Trên đây là toàn bộ thông tin về Git conflicts cũng như cách giải quyết xung đột conflict trong Git khi thực hiện hợp nhất merge mà Aptech đã chia sẻ đến cho bạn. Mong rằng với những thông tin ở trên đã có thể dễ dàng áp dụng hơn trong các dự án của mình.

Leave a Reply

Your email address will not be published. Required fields are marked *