Minden commit megőrződik
Ez nem így van. A git elvileg bármikor eldobhat minden olyan commit-ot, amely a commit gráfban egyetlen symbolic ref-ből (branch-ből, tag-ből) sem elérhető, parent pointer-ek mentén. Lásd "git gc [--prune]". Ha nem így lenne, akkor a repo-kban a hulladék mennyisége korlátlan lenne; a git-rebase és a non-fast-forward push rengeteg orphan commit-ot generálnak; ezeket időnként el kell takarítani. Természetesen a garbage collection nem azonnali; az nem lenne hasznos.
(Jó példa a késleltetett szemétgyűjtés hasznosságára a "git reflog --date=local BRANCH". Ha elrontasz egy rebase-t, de úgy, hogy be is fejezed (tehát a branch "át is áll"), akkor még egy ideig a branch-et "git reset --hard"-dal vissza tudod irányítani a branch egy korábbi változatára, amit a git-reflog-ból tudsz esetleg kinézni. De a szemétgyűjtés ritkasága nem garantált; elvileg semmi nem zárja ki, hogy egy cron job naponta futtasson a nagy repo-kon git-gc-t.)
A másik ellenvetésem az, hogy a commit hash-ek (az élettartamuktól függetlenül) nem beszédesek; sokkal beszédesebb, ha "feature-v1", "feature-v2" stb hivatkozásaink vannak.
erre csinálhatsz bármikor hookot és megcsinálja automatikusan
Ez mondjuk jó ötlet!; nem gondoltam rá.