Nguyên nhân thường gặp của xung đột merge
Khi nhiều lập trình viên cùng làm việc trên một dự án, việc đồng thời chỉnh sửa cùng một file hoặc cùng một đoạn mã là không thể tránh khỏi. Khi thực hiện git merge hoặc git rebase, Git sẽ cố gắng tự động hợp nhất các thay đổi. Nếu không thể quyết định được phần nào nên giữ, Git sẽ báo xung đột và yêu cầu người dùng can thiệp.
Các công cụ và lệnh hỗ trợ giải quyết xung đột
Sử dụng git mergetool
Lệnh git mergetool mở một trình so sánh đồ họa (hoặc dòng lệnh) giúp bạn xem chi tiết các phần xung đột và lựa chọn nội dung cần giữ.
git mergetool
Kích hoạt git rerere để tự động ghi nhớ cách giải quyết
Rerere (reuse recorded resolution) lưu lại các quyết định giải quyết xung đột. Khi gặp lại cùng một xung đột, Git sẽ tự động áp dụng giải pháp đã ghi nhớ, giảm thiểu công sức.
git config --global rerere.enabled true
Chiến lược giữ lịch sử sạch với rebase
Thay vì tạo một merge commit, việc sử dụng git rebase giúp đưa các commit của nhánh tính năng lên trên nhánh develop một cách tuyến tính. Khi có xung đột, bạn sẽ giải quyết ngay trong quá trình rebase và cuối cùng có một lịch sử commit gọn gàng.
git checkout feature/login git rebase develop # Xảy ra xung đột, chỉnh sửa file, sau đó: git add . git rebase --continue
Sử dụng rebase tương tác để chỉnh sửa commit
Rebase tương tác (git rebase -i) cho phép bạn gộp, sửa, hoặc xóa các commit không cần thiết trước khi đưa lên nhánh chính. Đây là cách hiệu quả để loại bỏ các commit “fix typo” hoặc “debug” không có giá trị thực tế.
git rebase -i HEAD~5 # Trong trình soạn thảo, thay đổi "pick" thành "squash" hoặc "fixup" để gộp commit.
Kết hợp Pull Request và bảo vệ nhánh
Trong quy trình Git Flow, mọi thay đổi đều được đưa qua Pull Request (PR). Thiết lập quy tắc bảo vệ nhánh main và develop (yêu cầu review, không cho push trực tiếp) giúp ngăn chặn việc đẩy các commit chưa qua kiểm tra vào lịch sử chính. Khi PR được merge bằng tùy chọn “Rebase and merge”, lịch sử sẽ luôn ở dạng tuyến tính, dễ đọc và không có merge commit thừa.
Kết luận
Việc giải quyết xung đột một cách có hệ thống, kết hợp git mergetool, git rerere và rebase tương tác sẽ giúp bạn duy trì một lịch sử commit sạch sẽ, giảm thiểu rủi ro khi triển khai vào môi trường production. Tham khảo khóa học "Khóa học Git & Git Flow thực chiến" tại đây.








