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

Bài viết được sự cho phép bởi tác giả Sơn Dương

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”.

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.

Git conflict là gì?

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.

  Sự khác biệt giữa ‘git merge’ và ‘git rebase’ là gì?

  Git: merge – rebase và những lưu ý

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.

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

Ở đâ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.

Tham khảo Job FrontEnd HOT trên TopDev!

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?

Xử lý conflict trên 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.

Xử lý conflict trên 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

Xử lý conflict trên 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é.

Bài viết gốc được đăng tải tại vntalking.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev