Pour l'amour d'une expérience, disons que votre après avoir commis, Disons, après cela, je modifierai manuellement le fichier À ce stade, le statut GIT reconnaît qu'un nouveau fichier non engagé a besoin d'une attention particulière. C'est le même fichier mon deuxième titre pris en charge avant. P> Si je vous engageez. git journal code> identifie les indications suivantes
.git / refs / têtes / têtes / Master Code> Points à 16BC8486FB34CF9A6FAF0F7DF606AE72AD9A438. P>
.git / refs / têtes / maître code> fichier à pointe sur 9188f9a25b045f130b088888bc3f638099fa7f212 p>
Git Journal code> montre maintenant P>
commit b317f67686f9e6ab1eaabf47073b401d677205d5 // 2nd file committed for the 2nd time
commit 9188f9a25b045f130b08888bc3f638099fa7f212 // initial commit
3 Réponses :
Question 1: Parce que le hachage est généré en tenant compte de tout en tenant compte, y compris les métadonnées de validation (qui contient lui-même la date et l'heure). P>
Question 2: Journal GIT CODE> Affiche le journal de la branche actuelle. Le commit
16bc8486 code> ne fait pas partie de celui-ci. Autant que je sache (je ne suis pas totalement sûr), le collectionneur des ordures le retiendra tôt ou tard, s'il le trouve avec rien ne le référençant (
git gc --help code>) .. p>
Sur Q2, branche GIT code> montre une seule branche d'existence à ce stade - * Maître. Quelle branche est l'ancien fichier maintenant une partie de?
@Jam: Cela ne fait partie d'aucune branche, c'est pourquoi il est candidat à la collecte des ordures. Vous pouvez "sauver" en créant une branche explicitement sur ce commettre branche git branche_name commit_hash code>.
@Mat, si un peu de temps passé par et que le hachage n'est pas facilement disponible, est-il possible de le récupérer d'une manière ou d'une autre?
@JAM: Vous ne devriez pas m'attendre à ce que, une fois que le GC décide de nettoyer des choses, c'est loin. Si vous ne l'avez pas ailleurs ailleurs (une fourchette ou juste une copie des fichiers), c'est loin pour toujours. Si vous voulez le garder, créez une branche pointée vers elle et c'est ça. Ce n'est pas nécessaire, que vous poussez la branche quelque part, vous pouvez le garder local.
@Jam s'il n'a pas été déposé collecté, oui, vous pouvez utiliser git fsck --untréyable code> pour trouver tous ces engagements. Si cela a été recueilli, il est temps de tester vos sauvegardes :)
@Jam Git conserve les fichiers journaux de la manière dont les réfs ont changé au fil du temps - regardez la commande git reflog code> et
git log -g -g code>. Le collecteur des ordures prend les fichiers journaux en compte - il ne prune pas des objets tant qu'ils sont référencés des fichiers journaux (mais les fichiers journaux eux-mêmes sont automatiquement élagés après une certaine quantité de temps)
Le SHA1 est calculé à partir du diff et de toutes les métadonnées de ce commit (y compris l'auteur et le committerie, l'horodatage et diverses autres données). P>
Pour votre deuxième question, le commit des données est toujours présent mais ne fait plus partie d'une branche en direct. Parfois, Git dirigera une collection de déchets où diverses choses supprimées seront réellement supprimées. Vous remarquerez qu'une fois que vous l'exécutez manuellement en utilisant git gc code> que le commit non référencé sera parti et non même être accessible avec GIT SHOW. P>
Les valeurs SHA1 pour chacun des fichiers De même que les valeurs SHA1 pour les arbres Cependant, au sommet du même sommet, nous avons le Vous pouvez les rendre identiques si vous définissez délibérément l'auteur et la date de commière à l'aide des variables d'environnement afin qu'elles soient inchangées. P>
Corollaire supplémentaire; Si l'on leur rend identique, ils seront identiques aussi loin que le magasin d'objets et les graphiques de branche sont concernés. Ce sera comme si la division initiale, mais identique n'est jamais arrivée - elles sont indiscernables! Bonne chasse.
Read intéressant: book.git-scm.com/1_the_git_object_model.html