JuniorGit

Merge conflict là gì, bạn xử lý nó thế nào, và khi nào chọn merge, khi nào chọn rebase?

Người phỏng vấn muốn biết bạn đã thật sự làm việc nhóm với Git chưa, và có sợ khi thấy xung đột hay không. Họ cũng muốn nghe cách bạn tránh làm mất code của đồng nghiệp.

Một câu trả lời tốt giải thích merge conflict xảy ra khi hai nhánh cùng sửa một chỗ và Git không biết giữ bên nào, nên nó dừng lại và đánh dấu bằng ba dòng <<<<<<<, =======, >>>>>>>. Việc của bạn không phải xóa dấu mà là viết lại một đoạn đúng từ ý định của cả hai bên, chạy kiểm tra, rồi mới git add và hoàn tất. Chỉ xóa dòng đánh dấu và giữ cả hai đoạn thường tạo ra code hỏng hoặc trùng lặp. Nếu giữa chừng thấy rối, có thể hủy bằng git merge --abort hoặc git rebase --abort.

Về khác biệt, merge giữ nguyên lịch sử và thêm một commit gộp, nên an toàn và xử lý xung đột một lần. Rebase đặt commit của bạn lên đầu mới nhất của nhánh kia và áp lại từng commit, cho lịch sử thẳng nhưng viết lại commit, mỗi commit có thể xung đột riêng, và nhánh đã đẩy lên máy chủ thì phải push bằng --force-with-lease. Vì vậy rebase hợp với nhánh riêng chưa ai dùng.

Điểm cộng là biết rằng khi rebase, ours và theirs bị đảo vai so với merge, và biết dùng git reflog để tìm lại trạng thái trước khi làm hỏng.