2010-04-28 4 views

Répondre

4

Dans git, les commits ne sont que des objets. Lorsque vous git commit --amend, vous créez simplement un nouveau commit avec le même parent. Dans un premier temps qui ressemble à ceci: Maintenant

    {HEAD} 
        {master} 
---[A]---[B]---[C] 

vous modifiez C, la création d'une nouvelle commettras D:

    {HEAD} 
        {master} 
---[A]---[B]---[D] 
      \ 
      \ 
       [C] 

L'ancien C est toujours là pour le moment. Cependant, il n'est plus référencé par aucune branche, donc la prochaine fois qu'une récupération de place aura lieu, elle sera balayée.

+2

Et le garbage collection est fait par 'git gc', qui est exécuté périodiquement quand git décide que les choses ont besoin de nettoyage (bien qu'il puisse être exécuté manuellement). Les objets détachés par défaut ne sont taillés que s'ils ont au moins deux semaines. Le résultat est que tant que vous ne prenez pas un mois pour le réaliser, vous pouvez récupérer le vieux 'C' si vous décidez que 'D' n'est pas ce que vous vouliez. – Cascabel

+1

@Jefromi: +1, merci pour cet ajout utile. "Garbage Collection" implique généralement un très court laps de temps pour la plupart des gens, il est donc intéressant de noter que vous pouvez presque toujours dire "oups, je ne voulais pas faire ça" dans Git. –

+0

Ah, je vois. En fait, git a affiché le message: 'commit détaché ... ', ce qui signifie que mes changements disparaîtront au prochain garbage collection. C'est vraiment dangereux ... –

1

Une nouvelle validation est créée avec le même parent que l'ancienne validation et votre branche actuelle fait maintenant référence à la nouvelle validation. L'ancien commit est toujours dans la base de données d'objets et peut être trouvé avec git reflog.

2

Pour compléter la réponse de John, si vous ammend un ancien commit, rien n'arrive à ses enfants.

 old commit 
      v 
o--o--o--o--o--o--o--o--o < original branch tip 
      \ 
      o < ammended old commit & new branch tip 

Peut-être que ce que vous voulez faire peut être accompli avec un interactive rebase that squashes commits.