Cách xử lý conflict khi git merge – Vấn nạn đau đầu của mọi Dev

1
Dịch vụ dạy kèm gia sư lập trình

Git là một trong những giải pháp quản lý mã nguồn dự án hiệu quả nhất ở thời điểm hiện tại.

Đặc biệt là các dự án lớn, có nhiều thành viên tham gia, Git luôn thể hiện rõ sức mạnh. Tuy nhiên, mình tin là bạn đã từng rất bực mình, chỉ biết ngẩng mặt lên trời mà hét “Trời ơi”.

Trước khi vào nội dung chính, dành cho bạn nào chưa biết Git là gì thì tham khảo bài viết này nhé:

Bản thân mỗi khi bắt đầu một dự án mới, mình luôn phổ biến với các thành viên về quy tắc submit/pull code trên git, để hạn chế tối đa việc bị conflict mỗi khi merge các branch.

Tất nhiên, người tính không bằng trời tính, đôi lúc vẫn xảy ra trường hợp bị conflict code. Bạn sẽ giải quyết lỗi git conflict này như thế nào? Dưới đây là một cách mà mình muốn chia sẻ với bạn.

Git conflict là gì? Khi nào thì xảy ra conflict?

Hiểu đơn giản thì Git là hệ thống quản lý các phiên bản của một file mã nguồn. 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. 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).

Với nhóm dự án của mình, các developer luôn được yêu cầu phải pull code từ nhánh master về nhánh của mình vào đầu mỗi ngày làm việc. Nhờ đó mà hạn chế tối đa bị lỗi git conflict khi merge ngược trở lại nhánh master.

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.

Khi nào thì bị git conflict

Hình minh họa trên là ví dụ điển hình gây ra git conflict. Từ một nhánh main, một bạn developer (nick name: abid) tách ra nhánh mới, chỉnh sửa một file có dòng code “Hello, World” thành “Hello, Cat”. Trong khi bạn abid đang thực hiện thay đổi, thì nhánh main cũng bị được dòng code thành “Hello, Dog”.

Bùm! Khi bạn abid mà tạo request merge từ nhánh abid vào nhánh main, lập tức sẽ bị lỗi conflict và không thể merge được. Điều không thể bàn cãi!

Câu lệnh git merge có chức năng chính là hợp nhất hai nhánh và tự động xử lý conflict. Tuy nhiên, có những conflict mà không thể tự xử lý được, nó sẽ đánh dấu và dừng quá trình merge.

Những conflict này bắt buộc bạn phải xử lý thủ công.

Cách giải quyết git conflict bằng VS Code

Khi bạn thực hiện câu lệnh git merge và bị conflict. Bước đầu tiên, bạn cần tìm đến file bị báo conflict. Trong bài viết này, mình sử dụng VS Code để minh họa, còn các IDE khác cũng tương tự thôi.

Với VS Code, nó sẽ highlight đoạn code bị conflict.

vs-code-highlight

Ở đây có 3 lựa chọn mà bạn có thể chọn nhanh:

  • Accept Current Change: Tức là đoạn code conflict đó sẽ được thay thế bằng đoạn code của bạn, code mà bạn đang chỉnh sửa.
  • Accept Incoming Change: Chấp nhận thay thế bằng đoạn code lấy từ nhánh code khác về mà do developer khác sửa.
  • Accept Both Change: Lựa chọn này sẽ chấp nhận đoạn code của cả hai, cả của bạn và của developer khác. Thường là nó sẽ remix hai đoạn code lại với nhau, tỷ lệ code chạy được sau đó là rất thấp 😊
  • Giải pháp thủ công: Xóa hết đoạn code trong block conflict và tự viết lại code trong đó.
Cảnh báo: Việc quyết định lựa chọn đoạn code thay đổi nào phụ thuộc vào mục tiêu cuối cùng của dự án. Bạn nên thảo luận với bạn developer mà có đoạn code gây ra conflict đó.
Sau khi đã quyết định lựa chọn xong, bạn nhớ xóa bỏ các ký tự === , <<<<, và >>>> để tránh bị lỗi compile.

Cuối cùng là thực hiện commit lại code sau khi đã resolve conflict theo các bước sau:

  • Chạy lệnh git status để kiểm tra lại lần nữa những thay đổi
  • Chạy lệnh git add [file name] để thêm những file thay đổi vào stage
  • Thực hiện commit các thay đổi lên local repo bằng lệnh : git commit -m “nội dung message”
  • Cuối cùng là push code bằng lệnh git push

Vậy là xong rồi đấy.

Xử lý conflict trên Github

Đối với các dự án mã nguồn mở được quản lý trên Github, bạn sẽ phải thường xuyên kiểm tra các pull request của các bạn Contributors. Tất nhiên, cũng không thể tránh việc bị conflict.

Khi bạn mở một pull request, bạn sẽ biết được request này có bị conflict hay không? Nếu bị conflict thì bị ở những file nào?

vs-code-conflict-github

Cách xử lý conflict trên github cũng hoàn toàn tương tự như trên VS Code thôi.

Đầu tiên, bạn cần tìm tới file được báo là bị conflict và tìm tới dòng được đánh dấu bằng các ký tự <<<<< ====, >>>>

Tương tự, bạn cũng cần phải đưa ra quyết định lựa chọn code của bạn, hay code từ base branch hoặc giữ cả hai.

resolve-conflict-tren-github

Sau chọn xong thì bạn cũng cần phải xóa các ký tự đánh dấu <<<<< ====, >>>>

Cuối cùng là commit lại những thay đổi

commit-code-github

Trên đây là một số kinh nghiệm và phương pháp để resolve các git conflict.

Câu “Resolve conflict là một nghệ thuật thì người resolve là một nghệ sĩ “ quả thực không hề sai tý nào. Trong quá trình giải quyết conflict thì công đoạn đưa ra quyết định lựa chọn code nào là quan trọng nhất.

Bạn có kinh nghiệm gì hay đừng ngại chia sẻ dưới bình luận nhé.

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trước7 sai lầm lớn khiến việc học Javascript như “nước đổ lá khoai”
Bài tiếp theoDeploy ứng dụng VueJS lên Firebase trong một nốt nhạc
Sơn Dương
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

1
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Nguyễn Hưởng
Guest
Nguyễn Hưởng

Như trong bài viết có nói “các developer luôn được yêu cầu phải pull code từ nhánh master về nhánh của mình vào đầu mỗi ngày làm việc”. Ở đây có phải là pull code từ nhánh master sau đó merge vào branch riêng và thực hiện code tiếp không ạ?