rerere - «reuse recorded resolution», повторне використання записаних розв'язань конфліктів. Git запам'ятовує, як ви розв'язали конфлікт, і коли той самий конфлікт виникає знову, застосовує розв'язання автоматично.
git config --global rerere.enabled true
Як це працює:
- виникає конфлікт - Git записує «образ» конфлікту (обидві версії фрагмента) в
.git/rr-cache; - ви розв'язуєте конфлікт і робите коміт - Git записує результат;
- наступного разу при такому самому конфлікті Git підставляє збережене розв'язання:
Resolved 'app/Models/Invoice.php' using previous resolution.
Файл лишається не доданим до індексу - розв'язання варто переглянути й зробити git add (з rerere.autoUpdate true Git додає сам).
Коли це заощаджує час:
- довгоживуча гілка, яку регулярно оновлюють rebase-ом на
main: при кожному rebase ті самі конфлікти повторюються коміт за комітом; - пробне злиття: злити гілку, щоб перевірити, чи все збирається, скасувати злиття - а при справжньому злитті пізніше конфлікти вже розв'язані;
- скасований rebase: розв'язали половину конфліктів, зробили
git rebase --abort, почали знову - розв'язане вже не треба повторювати; - інтеграційні гілки (як у Git Flow чи при підготовці релізу), куди ті самі гілки зливаються багато разів.
Команди:
git rerere status # файли, для яких записано розв'язання
git rerere diff # що саме буде застосовано
git rerere forget app/Models/Invoice.php # забути неправильне розв'язання
Ризики:
- збережене помилкове розв'язання застосовуватиметься знову й знову - тому
forget; - rerere зіставляє текст конфлікту, а не зміст: якщо код навколо змінився, розв'язання може бути формально застосовне, але логічно хибне. Тести після злиття обов'язкові;
- кеш локальний і не передається колегам; старі записи прибирає
git gc(за замовчуванням через 60 днів для розв'язаних і 15 - для нерозв'язаних).