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.
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.
Ở đâ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 đó.
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?
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.
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
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:
- Git Submodules và ứng dụng trong việc chia sẻ tài nguyên dùng chung
- Git là gì mà lại giúp bạn và cả team làm việc tốt hơn?
- Những câu hỏi phỏng vấn về GIT cần nhớ ngay
Xem thêm Việc làm Developer hấp dẫn trên TopDev