Giới thiệu
Trong môi trường phát triển phần mềm hiện đại, Git Flow là một mô hình nhánh (branch) được nhiều đội ngũ áp dụng để quản lý vòng đời phát triển tính năng, bản phát hành và sửa lỗi. Hai thách thức thường gặp là xung đột merge khi hợp nhất nhánh tính năng vào develop, và việc viết lại lịch sử commit để giữ cho lịch sử sạch sẽ trước khi tạo Pull Request. Bài viết sẽ phân tích chi tiết cách giải quyết xung đột và cách sử dụng git rebase một cách an toàn trong quy trình Git Flow.
Xung đột merge trong Git Flow
Khi nào xung đột xảy ra
Xung đột thường xuất hiện khi hai nhánh cùng thay đổi một phần mã nguồn giống nhau. Ví dụ, nhánh feature/login và nhánh develop đều chỉnh sửa file auth.js. Khi thực hiện lệnh:
git checkout develop git merge feature/login
Git sẽ báo lỗi và hiển thị các đoạn mã xung đột.
<<<<<<< HEAD
function login() {
// code hiện tại
}
=======
function login() {
// code mới
}
>>>>>>> feature/login
Quy trình giải quyết xung đột
- Kiểm tra trạng thái: Sử dụng
git statusđể liệt kê các file có xung đột. - Sửa file: Mở file, quyết định giữ phần nào, xóa các ký hiệu
<<<<<<<,=======,>>>>>>>. - Thêm lại (stage) file bằng
git add <file>. - Hoàn thành merge bằng
git commit(Git sẽ tự tạo thông điệp “Merge branch …”).
Đối với dự án có quy tắc bảo vệ nhánh, bạn có thể tạo một Pull Request mới sau khi đã giải quyết xung đột và đẩy lên remote.
Sử dụng git rebase để viết lại lịch sử
Lý do nên rebase
Trong Git Flow, nhánh feature/* thường được tạo từ develop. Khi develop nhận nhiều commit mới, việc rebase nhánh tính năng lên develop giúp:
- Giữ cho lịch sử tuyến tính, dễ đọc.
- Giảm khả năng xung đột khi merge.
- Cho phép chỉnh sửa (squash, reword) các commit không cần thiết.
Cách thực hiện rebase tương tác
Bước 1: Chuyển sang nhánh tính năng.
git checkout feature/login
Bước 2: Thực hiện rebase tương tác với develop.
git rebase -i develop
Trình soạn thảo sẽ hiển thị danh sách commit:
pick e3a1b2c Thêm UI login pick 7f9d4a0 Sửa lỗi validation pick a9c3d5e Cập nhật tài liệu
Bạn có thể thay đổi pick thành squash để gộp các commit, hoặc reword để chỉnh sửa thông điệp.
Sau khi lưu và thoát, Git sẽ tự động áp dụng các thay đổi. Nếu gặp xung đột, quy trình giống như merge: sửa file, git add, rồi tiếp tục bằng git rebase --continue. Khi hoàn tất, đẩy nhánh lên remote với tùy chọn --force-with-lease để bảo vệ các thay đổi khác:
git push --force-with-lease origin feature/login
Kết luận
Việc nắm vững cách giải quyết xung đột merge và sử dụng git rebase một cách an toàn sẽ giúp đội ngũ duy trì lịch sử commit sạch sẽ, giảm rủi ro khi triển khai. Đối với những người muốn nâng cao kỹ năng Git trong môi trường Git Flow, việc thực hành qua các tình huống thực tế là cách học hiệu quả nhất. Tham khảo khóa học "Khóa học Git & Git Flow thực chiến" tại đây.






