O Git não foi projetado tanto quanto evoluiu .
Dê uma olhada sozinho. Clone o repositório oficial do git , abra-o gitk
(ou seu visualizador gráfico favorito do git) e veja as primeiras revisões.
Você verá que originalmente tinha apenas a funcionalidade principal (o banco de dados de objetos e o índice). Todo o resto foi feito à mão . No entanto, esse pequeno núcleo foi projetado para ser facilmente automatizado via script de shell. Os primeiros usuários do git escreveram seus próprios scripts de shell para automatizar tarefas comuns; pouco a pouco, esses scripts foram incorporados à distribuição git (veja o exemplo 839a7a0 ). Sempre que havia uma nova necessidade, os scripts eram adaptados para permitir isso. Muito mais tarde, vários desses scripts seriam reescritos em C.
Essa combinação de um núcleo limpo e ortogonal (que você ainda pode usar diretamente, se necessário), com uma camada superior que cresceu organicamente sobre ele, é o que dá ao git seu poder. Obviamente, é também o que fornece a grande quantidade de comandos e opções de nomes estranhos.
A compressão, os gráficos, a eliminação de números de revisão, enfatizando ramificações, esconderijas, controles remotos ... De onde tudo isso veio?
Muito disso não estava lá no começo.
Enquanto cada objeto foi compactado individualmente e as duplicatas foram evitadas por seus nomes, os arquivos "pack", responsáveis pela alta compactação que estamos acostumados a ver no git, não existiam. A filosofia no começo era "espaço em disco é barato".
Se por "gráficos" você quer dizer visualizadores gráficos gitk
, eles apareceram mais tarde (AFAIK, o primeiro foi gitk
). AFAIK, BitKeeper também teve um visualizador de histórico gráfico.
Livrar-se dos números de versão, na verdade, o conceito principal do git de usar um sistema de arquivos endereçado a conteúdo para armazenar os objetos, veio principalmente de monotonia . Naquela época, monótono era lento; se não fosse esse o caso, é possível que o Linus o tivesse usado em vez de criar o git.
Enfatizar a ramificação é um tanto inevitável em um sistema de controle de versão distribuído, pois cada clone atua como uma ramificação separada.
O esconderijo ( git stash
) é, IIRC, bastante recente. Os reflogs, que ele usa, não estavam lá no começo.
Mesmo controles remotos não estavam lá inicialmente. Originalmente, você copiava os objetos manualmente usando rsync
.
Um por um, cada um desses recursos foi adicionado por alguém. Nem todos eles - talvez nem mesmo a maioria deles - foram escritos por Linus. Toda vez que alguém sente uma necessidade que o git não atende, pode-se criar um novo recurso na camada "encanamento" principal do git e propor a inclusão. Se for bom, provavelmente será aceito, aprimorando ainda mais a utilidade do git (e sua complexidade da linha de comando).