2009-08-27 7 views
2

Voici mes expériences.Multiple "git add" avant "git commit"

git init 
echo hello > some.txt 
git add some.txt 

-- objects 
    -- f2 (blob "hello") 

echo hola > some.txt 
git add some.txt 

-- objects 
    -- f2 (blob "hello") 
    -- 53 (blob "hola") 

git commit -m "..." 

-- objects 
    -- f2 (blob "hello") 
    -- 53 (blob "hola") 
    -- 5c (tree 
       "some.txt" -> 53) 
    -- 61 (commit "tree 5c") 

Comme on peut le voir tous les « git ajouter » créé objet blob et « git commit » Commited la dernière blob 53.

Mais remarquez que blob intermédiaire « f2 » est encore dans le référentiel. Y a-t-il une raison quelconque pour cela? Comment puis-je utiliser ce blob? Ou comment puis-je l'enlever?

Répondre

7

Whee m'a pris une minute pour comprendre ce que vous demandiez :)

Git enregistre tout pendant au moins une période de temps. Si vous exécutez

git fsck 

Vous devriez voir

dangling blob f2... 

C'est une conception de git de laisser les choses sans référence assis pendant un certain temps. L'idée est que si vous "oups" quelque chose, le fichier est toujours là pour être trouvé. C'est aussi une "optimisation paresseuse" où l'ajout de quelque chose sauve l'état pour s'engager en tant que fichier adressé par le contenu, et commettre quelque chose est juste en train de construire une référence à ceux-ci. La partie nettoyage est séparée. Vous devriez regarder la documentation pour git prune et git gc.

Par défaut, il sera nettoyé dans une série de git gc qui se passe au moins 2 semaines plus tard. En outre, l'utilité de git reflog (souvent utilisé pour récupérer les commits et les rebasages qui ont tout vissé) serait perdue dans le cas d'un nettoyage agressif.

+0

Aha, c'est bon! Je peux même obtenir ce blob avec "git show f2 ..." – alex2k8