Da Anonimo (non verificato) , 29 Aprile 2026

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.