Sử dụng tính năng rerere của Git để thoát khỏi "địa ngục" xung đột mã nguồn
Bài viết giới thiệu tính năng ít được biết đến nhưng cực kỳ hữu ích của Git là `rerere` (Reuse Recorded Resolution). Tính năng này giúp ghi nhớ cách bạn giải quyết các xung đột trong quá khứ và tự động áp dụng lại cho các xung đột tương tự trong tương lai, giúp tiết kiệm thời gian và công sức đáng kể cho lập trình viên.

Bạn đã bao giờ cố gắng merge (hợp nhất) hai nhánh (branch) lại nhau nhưng lại rơi vào tình trạng xung đột (conflict) liên tục không? Bạn sửa một loạt xung đột, chạy lệnh git merge --continue, và rồi... những xung đột cũ lại hiện ra. Lặp lại quy trình này vài lần, bạn có thể muốn bỏ cuộc vì nó quá tốn thời gian và công sức.
Bạn có biết rằng Git có một tính năng được thiết kế riêng để giải quyết vấn đề này không? Tính năng đó gọi là rerere, và tôi sẽ giúp bạn khám phá cách nó có thể làm phong phú thêm trải nghiệm lập trình của bạn ngay bây giờ.
Rerere là gì?
rerere là viết tắt của Reuse Recorded Resolution (Tái sử dụng bản ghi giải quyết). Tóm lại, tính năng này yêu cầu Git ghi nhớ cách bạn đã giải quyết các khối mã (hunks) trong quá khứ. Nếu cùng một xung đột xuất hiện ở một tệp tin trong tương lai, Git sẽ tự động áp dụng lại những gì bạn đã làm lần trước.
Cách kích hoạt tính năng
Để bật tính năng này, bạn chỉ cần chạy lệnh đơn giản sau:
git config --global rerere.enabled true
Bạn cũng có thể bật nó bằng cách tạo thư mục .git/rr-cache trong dự án của mình, nhưng cài đặt toàn cục (global setting) như trên rõ ràng và thuận tiện hơn nhiều.
Cách hoạt động qua ví dụ
Hãy cùng đi qua một ví dụ để xem cách nó hoạt động. Giả sử chúng ta có một dự án nhỏ chỉ với một tệp tin user.rb.
Bạn tạo một nhánh mới tên là dev từ master và thêm một dòng vào user.rb. Sau đó, bạn muốn đẩy thay đổi này lên staging bằng cách merge nhánh dev vào staging. Tuy nhiên, ôi không, đã có ai đó merge một thay đổi vào staging ảnh hưởng đến đúng dòng bạn đang sửa trong user.rb.
Khi chạy lệnh merge, bạn sẽ thấy thông báo xung đột quen thuộc:
CONFLICT (content): Merge conflict in user.rb
Tuy nhiên, nếu bạn đã bật rerere, thông báo sẽ có thêm một dòng quan trọng:
Recorded preimage for 'user.rb'
Dòng này cho biết Git đã ghi lại trạng thái của xung đột trước khi bạn sửa nó.
Bây giờ, bạn thực hiện quy trình xử lý xung đột như bình thường: chọn các thay đổi cần giữ lại và commit kết quả. Khi bạn chạy git merge --continue, Git sẽ báo cáo:
Recorded resolution for 'user.rb'.
Điều này có nghĩa là Git đã ghi nhớ cách bạn sửa xung đột này.
Phép màu của rerere
Hãy thử hủy lệnh merge vừa rồi bằng git reset --hard HEAD^ và merge lại một lần nữa.
Lần này, thông báo sẽ là:
Resolved 'user.rb' using previous resolution.
Dòng thông báo này chính là chìa khóa. Bạn thậm chí không cần nhìn vào tệp tin, chỉ cần commit kết quả là xong. Điều này hoạt động vì Git nhận ra xung đột, tìm trong thư mục rr-cache và nhận ra khối mã này giống hệt với lần merge trước, nên nó áp dụng quyết định của bạn từ lần trước!
Hy vọng bạn thấy tính năng nhỏ nhưng có võ này hữu ích cho quy trình phát triển phần mềm hàng ngày của mình.
Bài viết liên quan

Công nghệ
CEO Palantir: 10% thế giới "ghét chúng tôi một cách chuyên nghiệp"
05 tháng 5, 2026

Phần mềm
Nvidia chính thức khai tử ứng dụng GeForce Control Panel sau 20 năm gắn bó
26 tháng 5, 2026

Phần mềm
Chính phủ Mỹ yêu cầu Instructure giải trình về sự cố tấn công mạng và lộ dữ liệu Canvas
13 tháng 5, 2026
