Git n'a pas été conçu autant qu'il a évolué .
Jetez un œil par vous-même. Clonez le référentiel git officiel , ouvrez-le dans gitk
(ou votre visionneuse graphique de journaux git préférée), et regardez ses premières révisions.
Vous verrez qu'il n'avait à l'origine que la fonctionnalité de base (la base de données d'objets et l'index). Tout le reste a été fait à la main . Cependant, ce petit noyau a été conçu pour être facilement automatisé via des scripts shell. Les premiers utilisateurs de git ont écrit leurs propres scripts shell pour automatiser les tâches courantes; peu à peu, ces scripts ont été incorporés dans la distribution git (voir pour un premier exemple 839a7a0 ). Chaque fois qu'il y avait un nouveau besoin, les scripts étaient adaptés pour le permettre. Beaucoup plus tard, plusieurs de ces scripts seraient réécrits en C.
Cette combinaison d'un noyau orthogonal propre (que vous pouvez toujours utiliser directement si vous en avez besoin), avec une couche supérieure qui s'est développée organiquement dessus, est ce qui donne à git sa puissance. Bien sûr, c'est aussi ce qui lui donne la grande quantité de commandes et d'options aux noms étranges.
La compression, les graphiques, se débarrasser des numéros de révision, mettre l'accent sur les branchements, le stashing, les télécommandes ... D'où tout cela vient-il?
Une grande partie de cela n'était pas là au début.
Alors que chaque objet était compressé individuellement et que les doublons étaient évités par leur dénomination, les fichiers "pack" qui sont responsables de la compression élevée que nous avons l'habitude de voir dans git n'existaient pas. La philosophie au début était "l'espace disque est bon marché".
Si par "les graphiques" vous voulez dire les téléspectateurs graphiques gitk
, ils sont apparus plus tard (AFAIK, le premier l'était gitk
). AFAIK, BitKeeper avait également une visionneuse d'historique graphique.
Se débarrasser des numéros de version, en fait, le concept de base de git consistant à utiliser un système de fichiers adressé par contenu pour stocker les objets, venait principalement de monotone . À cette époque, le monotone était lent; si ce n'était pas le cas, il est possible que Linus l'ait utilisé au lieu de créer git.
Mettre l'accent sur la ramification est quelque peu inévitable sur un système de contrôle de version distribué, car chaque clone agit comme une branche distincte.
Stashing ( git stash
) est, IIRC, assez récent. Les reflogs, qu'il utilise, n'étaient pas là au début.
Même les télécommandes n'étaient pas là au départ. À l'origine, vous avez copié les objets à la main à l'aide de rsync
.
Une par une, chacune de ces fonctionnalités a été ajoutée par quelqu'un. Tous - peut-être même pas la plupart - n'ont pas tous été écrits par Linus. Chaque fois que quelqu'un ressent un besoin auquel git ne répond pas, on peut créer une nouvelle fonctionnalité sur la couche "plomberie" principale de git, et la proposer pour inclusion. S'il est bon, il sera probablement accepté, améliorant encore l'utilité de git (et sa complexité en ligne de commande).