Git не был разработан так, как развился .
Посмотрите сами. Клонируйте официальный репозиторий git , откройте его gitk
(или ваш любимый графический просмотрщик журнала git) и посмотрите его самые ранние ревизии.
Вы увидите, что изначально он имел только основные функции (объектную базу данных и индекс). Все остальное было сделано вручную . Однако это небольшое ядро было разработано так, чтобы его можно было легко автоматизировать с помощью сценариев оболочки. Первые пользователи git написали свои собственные сценарии оболочки для автоматизации общих задач; постепенно эти скрипты были включены в дистрибутив git (см. более ранний пример 839a7a0 ). Каждый раз, когда возникала новая потребность, сценарии адаптировались к ней. Намного позже, некоторые из этих сценариев будут переписаны на C.
Эта комбинация чистого, ортогонального ядра (которое вы все еще можете использовать напрямую, если у вас есть такая необходимость) с верхним слоем, органически выросшим над ним, - вот что дает git его силу. Конечно, это также то, что дает ему большое количество команд и опций со странными именами.
Сжатие, графики, избавление от номеров ревизий, выделение ветвлений, копирование, удаленность ... Откуда все это?
Многое этого не было в начале.
Несмотря на то, что каждый объект был сжат по отдельности, а дублирование было предотвращено путем присвоения им имен, «пакетных» файлов, которые отвечают за высокое сжатие, которое мы привыкли видеть в git, не существует. Сначала философия гласила: «Дисковое пространство дешево».
Если под «графиками» вы имеете в виду графических зрителей gitk
, они появились позже (AFAIK, первым был gitk
). AFAIK, BitKeeper также имел графический просмотрщик истории.
Избавившись от номеров версий, на самом деле основная концепция git, заключающаяся в использовании файловой системы с адресным содержимым для хранения объектов, в основном исходила из монотонности . В то время монотонность была медленной; если бы это было не так, возможно, Линус использовал бы его вместо создания git.
Подчеркивание ветвления несколько неизбежно в распределенной системе управления версиями, поскольку каждый клон действует как отдельная ветвь.
Stashing ( git stash
), IIRC, совсем недавно. Reflogs, которые он использует, не было там в начале.
Даже пультов там не было изначально. Первоначально вы скопировали объекты вручную, используя rsync
.
Один за другим, каждая из этих функций была добавлена кем-то. Не все из них - возможно, даже не большинство из них - были написаны Линусом. Каждый раз, когда кто-то чувствует потребность, которую git не выполняет, можно создать новую функцию поверх основного «слесарного» слоя git и предложить ее для включения. Если это хорошо, то, вероятно, будет принято, что еще больше увеличит полезность git (и сложность его командной строки).