Comment Git a-t-il été conçu?

9

Mon lieu de travail est récemment passé à Git et je l'aime (et je déteste!). Je l'aime vraiment et c'est extrêmement puissant. La seule partie que je déteste, c'est que parfois c'est trop puissant (et peut-être un peu laconique / déroutant).

Ma question est ... Comment Git a-t-il été conçu? En l'utilisant simplement pendant un court laps de temps, vous avez l'impression qu'il peut gérer de nombreux flux de travail obscurs que d'autres systèmes de contrôle de version ne pouvaient pas. Mais il se sent également élégant en dessous. Et vite!

C'est sans doute en partie grâce au talent de Linus. Mais je me demande, la conception globale de git était-elle basée sur quelque chose? J'ai lu BitKeeper mais les comptes manquent de détails techniques. 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?

Linus a vraiment frappé celui-ci hors du parc et à peu près du premier essai! C'est assez bon à utiliser une fois que vous avez dépassé la courbe d'apprentissage.

Mark Canlas
la source
vous pourriez probablement obtenir de l'aide sur le canal git IRC (#git sur freenode)
yati sagade
2
you get the feel that it can handle many obscure workflows that other version control systems could not: C'est probablement parce qu'il a été conçu pour gérer le noyau Linux, un morceau de code notoirement hackeux, volumineux et complexe.
yannis
1
À l'occasion du 10e anniversaire de Git, voici un article d'une interview avec Torvalds: linux.com/news/featured-blogs/185-jennifer-cloer/…
Sridhar Sarnobat

Réponses:

17

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).

CesarB
la source
"AFAIK, BitKeeper avait également une visionneuse d'historique graphique." Oui. Ce n'est pas exactement joli, mais c'est très fonctionnel. Voir bitkeeper.com/Test.Using.Looking.html , bien que cela montre mal comment il affiche les branches.
Bryan Oakley
1
Également une lecture intéressante, quelques e-mails sélectionnés depuis le début de git, montrant un peu de son évolution initiale: kerneltrap.org/node/4982
CesarB
Les programmeurs avaient-ils l'habitude d'émuler certaines fonctionnalités de git avec cvs + rsync + httpd? Je serais intéressé d'entendre quelles solutions maison étaient possibles.
Sridhar Sarnobat
8

Je pense que le point principal est simplement que git a été conçu par la personne la plus qualifiée de la planète pour le faire. Et je ne parle pas de talent, je parle d'expérience: je doute qu'il y ait quelqu'un d'autre qui ait été en charge d'une base de code avec une combinaison comparable de taille et de nombre de contributeurs comme le noyau Linux et qui s'occupe toujours de la plupart de l'intégration travailler lui-même.

Linus connaissait donc mieux que quiconque les exigences et les cas d'utilisation d'un système de contrôle de version distribué. Et bien sûr, cela a aidé que la plupart du codage qu'il traitait était en C, et une grande partie des performances critiques.

Fondamentalement, c'est l'exemple ultime de gratter ses propres démangeaisons.

Michael Borgwardt
la source
6
"Célibataire le plus qualifié"? Je ne pense pas. Il existe de nombreuses personnes intelligentes qui sont qualifiées pour écrire le contrôle de source distribué. Les gars de BitMover (l'entreprise derrière BitKeeper) savent vraiment vraiment ce qu'ils font. Linus rend même hommage à Larry McVoy pour lui avoir montré comment le contrôle du code source devrait fonctionner. Sans Larry, il n'y aurait pas de conneries.
Bryan Oakley
1
@BryanOakley, je pense que nous pouvons éviter de dénigrer quand quelqu'un complète quelqu'un pour quelque chose de bien. Tout le monde sait que cette exigence fait un excellent développeur. Donc, si demain, on vous présente un gros problème, on se souviendra peut-être de vous, comme nous le faisons Dennis Ritchie. Personne n'est meilleur que les autres, c'est juste qu'ils ont rencontré une exigence reconnue dans le monde entier et fourni une solution en premier.
Pankaj Upadhyay
2
@Bryan: Je suis sûr que l'expérience de l'utilisation de BitKeeper a également beaucoup appris à Linus, et j'aurais dû le mentionner. Et bien sûr, il y a beaucoup d'autres personnes intelligentes et qualifiées qui savent ce qu'elles font. Mais je maintiens toujours que l'expérience de Linus dans la maintenance du noyau fait de lui le plus qualifié, sur le plan de l'expérience. Je me trompe peut-être, mais pouvez-vous signaler un autre projet aussi important, avec autant de contributeurs, et où la personne responsable de tout cela est toujours aussi profondément impliquée dans la collaboration du code réel de tous ces contributeurs?
Michael Borgwardt,
@Pankaj Upadhyay: Je ne dénigre personne, j'expliquais simplement pourquoi j'ai rétrogradé la réponse. Vous avez dit quelque chose à propos de "fourni une solution d'abord", ce qui signifie, je pense, que vous pensez que git était en quelque sorte "premier" à certains égards. À quoi pensez-vous que c'était d'abord? Ce n'était certainement pas le premier outil scm distribué de loin.
Bryan Oakley,
1
@DeadMG: La partie la plus importante de cette déclaration vient ensuite "... et une grande partie des performances critiques". Je doute que vous en trouverez beaucoup qui diront que C n'est pas très bien adapté à la mise en œuvre de code haute performance à faible surcharge si vous le connaissez bien.
Michael Borgwardt
6

Il a été conçu à peu près exactement comme décrit dans The Git Parable .

Imaginez que vous avez un ordinateur qui n'a rien d'autre qu'un éditeur de texte et quelques commandes de système de fichiers. Imaginez maintenant que vous avez décidé d'écrire un gros logiciel sur ce système. Parce que vous êtes un développeur de logiciels responsable, vous décidez que vous devez inventer une sorte de méthode pour garder une trace des versions de votre logiciel afin de pouvoir récupérer le code que vous avez précédemment modifié ou supprimé. Ce qui suit est une histoire sur la façon dont vous pourriez concevoir un tel système de contrôle de version (VCS) et le raisonnement derrière ces choix de conception.

Graham Borland
la source