Chào các bạn đã đến với chủ đề tiếp theo của mình. Như các bạn đã biết, Git là một công cụ dùng để quản lý source mà bất kỳ cty, project nào cũng sử dụng nó. Nó giúp cho chúng ta làm việc nhóm mượt mà hơn. Nhưng đôi lúc, trong 1 team, sẽ có nhiều đồng đội cùng develop chung 1 tính năng. Và việc xảy ra xung đột (conflict) là việc việc xảy ra hằng ngày. Trong nội dung bài này, chúng ta sẽ cùng nhau tìm hiểu về khái niệm conflict trong git và làm thế nào để xử lý conflict khi merge code nhé.
1. Conflict trong Git là gì?
Như đã nói ở trên, conflict có nghĩa là xung đột. Vậy xung đột xảy ra như thế nào trong quá trình develop?
Thông thường, các developer trong dự án sẽ làm việc trên các nhánh dành riêng của họ. Khi task hoàn thành, developer sẽ tạo merge request để merge code từ nhánh của họ vào nhánh master (nhánh chính của dự án). Tuy nhiên, khi nhiều developer mà cùng chỉnh sửa ở cùng một dòng code thì khả năng bị conflict khi merge là vô cùng cao.
Ví vụ như hình trên, từ nhánh master, bạn dev_a tạo ra 1 nhánh mới alice, và chỉnh sửa dòng code “Hello world!” thành “Hello dog!”. Trong khi đó, ở nhánh master, bạn dev_b cũng chỉnh sửa dòng code “Hello world!” thành “Hello cat!”.
Lúc này, khi bạn dev_a tạo merge request từ nhánh alice vào nhánh master. Ngay lập tức sẽ xuất hiện lỗi conflict và không thể nào merge được.
Khi merge request, sẽ có 2 khả năng xảy ra, 1 là git sẽ tự động xử lý conflict giúp mình. Trường hợp còn lại là nó sẽ báo lỗi và sẽ không cho bạn merge. Những conflict dạng này bắt buộc bạn phải xử lý thủ công.
2. Xử lý conflict khi merge code như thế nào?
Có nhiều cách để xử lý conflict. Trong bài này, mình sẽ hướng dẫn các bạn resolve conflict trực tiếp trên GitHub.
Giả sử mình tạo ra 2 branch task1 và task2 và cùng update 1 file test.txt. Theo nguyên tắc, khi merge code vào nhánh chính master, nhánh con nào merge trước thì nhánh đó sẽ ít bị conflict hơn. Trong ví dụ này, khi branch task1 merge vào nhánh main trước, thì nhánh này sẽ merge bình thường mà không bị bất kỳ lỗi gì. Nhưng khi branch task2 merge vào, thì chắc chắc là branch này sẽ bị conflict. Vì vậy bạn sẽ phải thực hiện resolve conflict thì thao tác merge mới hoàn thành 100%.
Bước 1: từ nhánh chính master, tạo 1 file test.txt. Sau đó tạo thêm 2 branch task1 và task2
Bước 2: Chuyển sang làm việc tại task1, sửa nội dung file test.txt thành “Xin chào, đây là demo branch1” và thực hiện commit.
$ git checkout task1
$ git add .
$ git commit -m "Commit file demo branch1"
$ git push
Bước 3: Chuyển sang làm việc tại task2, sửa nội dung file test.txt thành “Xin chào, đây là demo branch2” và thực hiện commit.
$ git checkout task2
$ git add .
$ git commit -m "Commit file demo branch2"
$ git push
Như vậy cả 2 branch trên ta đều sửa chung một file test.txt. Bây giờ ta sẽ merge cả 2 branch task1 và task2 vào nhánh master. Như đã nói ở trên, nhánh nào merge trước thì sẽ ít gặp lỗi conflict. Vì vậy, nếu bạn merge lần lượt branch task1 vào nhánh master trước, thì sẽ không gặp lỗi. Sau đó, nếu bạn merge branch task2 vào nhánh master, thì lỗi conflict sẽ bắt đầu xảy ra.
Bây giờ, bạn hãy click vào buton Resolve conflicts thì sẽ thấy nội dung của nó như sau:
Đoạn conflict được bắt đầu bằng <<<<<<< HEAD
và kết thúc tại >>>>>>> branch1
, được ngăn cách bởi dấu =======
. Trong đó đoạn trên là của branch hiện tại (test2) và đoạn dưới là của branch cần merge (master/main).
Nhiệm vụ bây giờ của bạn là xem xét nội dung bị conflict đó xem cần sửa chỗ nào, lấy đoạn nào. Sau đó xóa đi những ký hiệu trên. Giả sử mình muốn lấy cả 2 thì lúc này mình sẽ sửa file test.txt
thành:
Sau khi resolve xong, bạn hãy click vào button Mark as resolved. Sau đó, tiếp tục click vào button Commit merge
Sau đó, bạn tiếp tục pull request lại 1 lần nữa nhé.
3. Lời kết
Như vậy, mình đã hướng dẫn các bạn xong cách xử lý khi bị xung đột code. Khi các bạn join vào dự án thực tế, sẽ có rất nhiều bạn làm chung team với bạn, do đó việc xảy ra xung đột code xảy ra mỗi ngày. Vì vậy, các bạn cần phải review code thật cẩn thận khi xử lý xung đột. Nếu không, bạn sẽ làm mất code của đồng đội của bạn.
Bái bai các bạn. Hẹn gặp lại các bạn ở các chủ đề tiếp theo. Chúc các bạn thành công.
Nguồn tham khảo:
https://vntalking.com/cach-xu-ly-conflict-khi-git-merge.html
https://freetuts.net/git-lenh-merge-branch-xu-ly-conflict-1076.html