Editare la storia senza riscriverla
A volte si vuole unire storie (un import Subversion convertito che incontra una continuazione, per esempio) senza riscrivere i commit. Graft e lo spazio dei nomi refs/replace/ permettono a Git di fingere che il genitore di un commit sia un commit diverso, lasciando intatti gli oggetti originali.
Graft (legacy)
# .git/info/grafts
<child-sha> <new-parent-sha>
Replace ref
git replace --graft <child> <new-parent>
git replace --graft v3.0.0 v2.99.0
git replace --convert-graft-file
git replace -d <sha>
git replace -l
Caso d'uso: cucire import
git replace --graft $(git rev-list --max-parents=0 main | head -1) svn-history-tip
Condivisione
git push origin 'refs/replace/*:refs/replace/*'
Disabilitare temporaneamente
git --no-replace-objects log
GIT_NO_REPLACE_OBJECTS=1 git log
Errori comuni
Confondere replace con riscrittura — replace non cambia gli SHA degli oggetti, quindi le firme restano valide ma il "vero" genitore di un commit non e quello che si vede.