git rerere merkt sich Konfliktlösungen
- Matt
Ein Rebase über zwölf Commits, und der dritte Konflikt sieht verdächtig genauso aus wie der, den ich schon beim zweiten gelöst habe. Bei einem lang lebenden Feature-Branch, der immer wieder gegen master rebased wird, passiert das ständig: derselbe Hunk kollidiert bei jedem Rebase erneut, weil sich beide Seiten seit dem letzten Mal nicht mehr geändert haben.
Dagegen hilft git config rerere.enabled true. Rerere steht für “reuse recorded resolution”: Git merkt sich, wie ein Konflikt aufgelöst wurde, und wendet dieselbe Lösung an, sobald derselbe Konflikt wieder auftaucht. Die Aufzeichnungen landen in .git/rr-cache/ und gelten reposcope, nicht global.
Mit rerere.autoupdate true schreibt Git die wiedererkannte Lösung sogar direkt in die Staging Area, ohne dass man noch git add aufrufen muss. git rerere status zeigt, welche Pfade gerade aufgezeichnet werden, git rerere forget <pfad> löscht eine falsch gelernte Lösung wieder.
Der Haken: Rerere merkt sich, was einmal richtig war, nicht was richtig ist. Ändert sich die Absicht hinter einem Merge, wendet Git die alte Lösung trotzdem an, und der Fehler fällt erst beim Testen auf.
Details in der Dokumentation zu git-rerere.