Git nie został zaprojektowany tak bardzo, jak ewoluował .
Spójrz sam. Sklonuj oficjalne repozytorium git , otwórz je gitk(lub swoją ulubioną graficzną przeglądarkę logów git) i spójrz na jego najwcześniejsze wersje.
Zobaczysz, że pierwotnie miał tylko bardzo podstawową funkcjonalność (bazę danych obiektów i indeks). Cała reszta została wykonana ręcznie . Jednak ten mały rdzeń został zaprojektowany w taki sposób, aby można go było łatwo zautomatyzować za pomocą skryptów powłoki. Pierwsi użytkownicy git napisali własne skrypty powłoki, aby zautomatyzować typowe zadania; krok po kroku te skrypty włączano do dystrybucji git (patrz wczesny przykład 839a7a0 ). Za każdym razem, gdy pojawiła się nowa potrzeba, skrypty były dostosowywane, aby na to pozwolić. Znacznie później kilka z tych skryptów zostanie przepisanych w C.
Ta kombinacja czystego, ortogonalnego rdzenia (z którego możesz nadal korzystać bezpośrednio, jeśli potrzebujesz) z górną warstwą, która wyrosła nad nim organicznie, jest tym, co daje mu siłę. Oczywiście to właśnie daje mu dużą liczbę dziwnie nazwanych poleceń i opcji.
Kompresja, wykresy, pozbycie się numerów wersji, podkreślanie rozgałęzień, ukrywanie, piloty ... Skąd to wszystko?
Na początku dużo tego nie było.
Chociaż każdy obiekt był indywidualnie kompresowany, a jego nazwy unikały duplikatów, pliki „pack”, które odpowiadają za wysoką kompresję, do której jesteśmy przyzwyczajeni w git, nie istniały. Na początku filozofia brzmiała: „miejsce na dysku jest tanie”.
Jeśli przez „wykresy” masz na myśli przeglądarkę graficzną gitk, to pojawili się później (AFAIK, pierwsza była gitk). AFAIK, BitKeeper miał również graficzną przeglądarkę historii.
Pozbycie się numerów wersji, tak naprawdę podstawowa koncepcja gita polegająca na wykorzystaniu systemu plików adresowanego do przechowywania obiektów, przeważnie pochodzi z monotonu . W tym czasie monotonia była powolna; gdyby tak nie było, możliwe, że Linus użyłby go zamiast tworzyć git.
Podkreślanie rozgałęzień jest nieco nieuniknione w rozproszonym systemie kontroli wersji, ponieważ każdy klon działa jako osobna gałąź.
Stashing ( git stash) jest, IIRC, całkiem nowy . Rejestrów, których używa, nie było na początku.
Początkowo nie było tam nawet pilotów. Początkowo obiekty zostały skopiowane ręcznie przy użyciu rsync.
Jedna po drugiej, każda z tych funkcji została dodana przez kogoś. Nie wszystkie z nich - być może nawet większość - zostały napisane przez Linusa. Za każdym razem, gdy ktoś odczuwa potrzebę, której git nie spełnia, można utworzyć nową funkcję nad podstawową warstwą „hydrauliczną” gita i zaproponować jej włączenie. Jeśli jest dobry, prawdopodobnie zostanie zaakceptowany, co jeszcze bardziej zwiększy użyteczność gita (i jego złożoność wiersza poleceń).