Git no fue diseñado tanto como evolucionó .
Echa un vistazo por ti mismo. Clone el repositorio oficial de git , ábralo gitk(o su visor gráfico de registro de git favorito) y mire sus primeras revisiones.
Verá que originalmente solo tenía la funcionalidad principal (la base de datos de objetos y el índice). Todo lo demás se hizo a mano . Sin embargo, este pequeño núcleo fue diseñado para automatizarse fácilmente a través de scripts de shell. Los primeros usuarios de git escribieron sus propios scripts de shell para automatizar tareas comunes; Poco a poco, estos scripts se incorporaron a la distribución de git (ver un ejemplo anterior 839a7a0 ). Cada vez que había una nueva necesidad, los scripts se adaptaban para permitirlo. Mucho más tarde, varios de estos scripts se reescribieron en C.
Esta combinación de un núcleo ortogonal limpio (que aún puede usar directamente si lo necesita), con una capa superior que creció orgánicamente sobre ella, es lo que le da a git su poder. Por supuesto, también es lo que le da la gran cantidad de comandos y opciones con nombres extraños.
La compresión, los gráficos, deshacerse de los números de revisión, enfatizar la ramificación, el escondite, los controles remotos ... ¿De dónde vino todo?
Mucho de eso no estaba allí al principio.
Si bien cada objeto se comprimió individualmente y se evitaron los duplicados al nombrarlos, los archivos de "paquete" que son responsables de la alta compresión que estamos acostumbrados a ver en git no existían. La filosofía al principio era "el espacio en disco es barato".
Si por "los gráficos" te refieres a espectadores gráficos como gitk, aparecieron más tarde (AFAIK, el primero fue gitk). AFAIK, BitKeeper también tenía un visor gráfico de historia.
Deshacerse de los números de versión, de hecho, el concepto central de git de usar un sistema de archivos con contenido para almacenar los objetos, en su mayoría provino de monótono . En ese momento, la monotonía era lenta; Si este no fuera el caso, es posible que Linus lo hubiera usado en lugar de crear git.
Enfatizar la ramificación es algo inevitable en un sistema de control de versiones distribuido, ya que cada clon actúa como una rama separada.
Stashing ( git stash) es, IIRC, bastante reciente. Los reflogs, que utiliza, no estaban allí al principio.
Incluso los controles remotos no estaban allí inicialmente. Originalmente, copiaste los objetos a mano usando rsync.
Una por una, cada una de estas características fue agregada por alguien. No todos, tal vez ni la mayoría, fueron escritos por Linus. Cada vez que alguien siente una necesidad que git no satisface, uno puede crear una nueva característica sobre la capa principal de "plomería" de git y proponerla para su inclusión. Si es bueno, probablemente será aceptado, mejorando aún más la utilidad de git (y la complejidad de su línea de comando).