Dạy Git cách tự sửa lỗi thay vì làm tay
Anh em đã bao giờ phải fix cùng một cái conflict đến 5-6 lần khi đang rebase một nhánh tính năng dài hơi chưa? Cảm giác đó cực kỳ ức chế. Git Rerere (Reuse Recorded Resolution) sinh ra để giải quyết đúng nỗi đau này. Hiểu đơn giản: bạn chỉ cần sửa cái conflict đó một lần duy nhất. Git sẽ học cách bạn làm và tự động áp dụng cho những lần sau nếu gặp đúng mớ hỗn độn đó.
Kích hoạt tính năng này cực kỳ đơn giản. Anh em chỉ cần chạy một lệnh duy nhất:
bash\ngit config --global rerere.enabled true
Sau khi bật, Git sẽ âm thầm ghi lại trạng thái trước và sau khi bạn sửa file. Nếu chỉ muốn dùng thử cho một dự án cụ thể, bạn không cần chạy config toàn cục. Thay vào đó, hãy tạo một thư mục tên là rr-cache trong folder .git của dự án:
bash\nmkdir .git/rr-cache
Case study thực tế: Khi 1 người refactor, 7 người còn lại “khóc thét”
Hồi trước, team mình có 8 người làm chung một dự án lớn với hơn 200 file logic. Mình nhận nhiệm vụ refactor lại toàn bộ cấu trúc file cấu hình trung tâm. Trong lúc mình thay đổi, các anh em khác vẫn đang mải miết đẩy code tính năng mới lên các nhánh riêng.
Cơn ác mộng bắt đầu khi mình merge bản refactor vào master. 7 người còn lại khi rebase đều dính cùng một loại conflict ở file cấu hình trên mọi commit của họ. Có ông dính tới 50 phát conflict giống hệt nhau. Thay vì ngồi click Accept Incoming thủ công từng cái, mình bảo cả team bật Rerere. Kết quả là sau khi họ xử lý cái đầu tiên, 49 cái sau Git tự “vượt rào” chỉ trong vài giây.
Kỹ thuật này cực kỳ lợi hại trong hai tình huống:
- Rebase liên tục: Bạn muốn nhánh của mình luôn bám sát master nhưng master lại thay đổi quá nhanh ở vùng code bạn đang sửa.
- Merge thử (Test merges): Bạn merge vài nhánh để chạy test thử nhưng chưa muốn commit. Bạn sửa conflict, test xong rồi
abort. Lần sau khi merge thật, bạn sẽ không phải ngồi sửa lại đống đó nữa.
Cơ chế Preimage và Postimage hoạt động thế nào?
Nhiều người sợ Git tự ý sửa làm hỏng code. Thực tế, cơ chế của nó rất minh bạch. Khi gặp conflict và Rerere đang bật, Git thực hiện 3 bước:
- Lưu Preimage: Git chụp lại file đang dính các dấu hiệu
<<<<<<<và=======. - Đợi bạn ra tay: Bạn dùng IDE để sửa code, xóa các marker conflict và lưu lại.
- Lưu Postimage: Ngay khi bạn
git add, Rerere lưu trạng thái file sạch sẽ này làm mẫu chuẩn.
Lần tới, nếu Git thấy file bị conflict có nội dung khớp 100% với bản preimage cũ, nó sẽ lôi bản postimage ra đè lên ngay lập tức. Bạn có thể soi xem Git đang nhớ những gì bằng lệnh:
bash\ngit rerere status
Hoặc xem sự khác biệt giữa cách sửa hiện tại so với trước đó:
bash\ngit rerere diff
Quản lý cache và các tùy chọn nâng cao
Mặc định, Rerere chỉ điền nội dung đã sửa chứ không tự git add để bạn còn kiểm tra lại. Nếu bạn tin tưởng tuyệt đối vào Git và muốn nó tự add luôn cho rảnh tay, hãy bật thêm tùy chọn này:
bash\ngit config --global rerere.autoupdate true
Dọn dẹp bộ nhớ
Mọi dữ liệu Rerere nằm trong .git/rr-cache. Để tránh thư mục này phình to, Git sẽ tự động xóa các bản preimage chưa giải quyết sau 15 ngày. Các bản đã giải quyết xong sẽ được giữ 60 ngày. Bạn có thể chủ động dọn dẹp bằng lệnh:
bash\ngit rerere gc
Sửa sai khi lỡ tay
Đôi khi bạn resolve conflict sai và Git đã nhanh nhảu ghi nhớ cái sai đó. Đừng lo, bạn có thể bắt nó học lại từ đầu bằng cách chạy:
bash\ngit rerere forget [tên_file]
Lời khuyên khi dùng Rerere trên môi trường dự án
Dù tiện lợi nhưng anh em cũng cần lưu ý vài điểm để tránh “tác dụng phụ”. Thứ nhất, hãy luôn liếc qua file sau khi Git báo đã tự động resolve xong. Đôi khi logic code xung quanh đã thay đổi khiến cách fix cũ không còn chính xác 100% về mặt nghiệp vụ. Thứ hai, Rerere phát huy sức mạnh tốt nhất trên các file config, boilerplate hoặc file hằng số (constants).
Tóm lại, Git Rerere giống như một trợ lý ghi chép thông minh. Nó không thay thế tư duy của bạn nhưng giúp loại bỏ những việc chân tay lặp lại vô nghĩa. Hãy bật nó lên ngay hôm nay, bạn sẽ thấy hối hận vì đã tốn quá nhiều thời gian để fix conflict thủ công suốt bấy lâu nay!

