Git sam nie wyrzuca informacji *. Wszystkie poprzednie wersje każdego pliku są zawsze dostępne do przywracania, różnic, inspekcji itp.
Całe drzewo kontra pojedyncze pliki
To, co możesz próbować pogodzić, to pomysł dostępu do starej wersji pojedynczego pliku w porównaniu z faktem, że model historii Gita koncentruje się na całym drzewie. Wersjonowanie całego drzewa wymaga nieco więcej pracy, aby zobaczyć (na przykład) wersję foo.c
takiej, jaka istniała dziesięć foo.c
-zmian temu w porównaniu do dziesięciu zmian całego drzewa temu:
# 10 foo.c-changes ago
git show $(git rev-list -n 10 --reverse HEAD -- foo.c | head -1):foo.c
# 10 whole-tree-changes ago
git show HEAD~10:foo.c
Korzyści z orientacji na drzewa, przede wszystkim możliwość przeglądania zatwierdzeń jako jednostki współzależnych zmian dokonanych w różnych częściach całego drzewa, ogólnie znacznie przewyższają dodatkowe pisanie (które można złagodzić za pomocą aliasów, skryptów itp.) I czas pracy procesora spędził na kopaniu przeszłych zobowiązań.
Wydajność magazynowania
Kiedy nowy obiekt (np. Plik z poprzednio niewidoczną zawartością) wchodzi do systemu, jest on zapisywany z kompresją zwykłą (zlib) jako „luźny obiekt”. Kiedy zgromadzi się wystarczająca liczba luźnych obiektów (w zależności od gc.auto
opcji konfiguracji lub gdy użytkownik uruchomi git gc lub jedną z komend pakowania niższego poziomu), Git zgromadzi wiele luźnych obiektów w jednym „pliku pakietu”.
Obiekty w pliku paczki mogą być przechowywane jako zwykłe skompresowane dane (tak samo jak luźny obiekt, tylko w pakiecie z innymi obiektami) lub jako skompresowane delty względem jakiegoś innego obiektu. Delty można łączyć ze sobą w konfigurowalne głębokości ( pack.depth
) i można je tworzyć z dowolnym odpowiednim obiektem ( pack.window
kontroluje, jak szeroko Git szuka najlepszej bazy delta; wersja historycznie niepowiązanego pliku może być użyta jako baza, jeśli zrobienie tego dałoby dobra kompresja delta). Szerokość geograficzna, jaką konfiguracje głębokości i rozmiaru okna dają silnikowi kompresji delta, często skutkuje lepszą kompresją delty niż prosta kompresja „jedna wersja względem drugiej / poprzedniej wersji poprzedniej wersji”.
Jest to agresywna kompresja delta (w połączeniu z normalną kompresją zlib), która często pozwala repozytorium Git (z pełną historią i nieskompresowanym drzewem roboczym) zajmować mniej miejsca niż pojedyncze pobranie SVN (z nieskompresowanym drzewem roboczym i nieskazitelną kopią).
Zobacz, w jaki sposób Git przechowuje obiekty i The Packfile w Git Community Book . Również git pack-objects podręcznika .
* Możesz powiedzieć Gitowi, że odrzuca zatwierdzenia, „przepisując historię” i komendami takimi jak git reset , ale nawet w takich przypadkach Git „zatrzymuje się” na nowo odrzuconych zatwierdzeniach przez chwilę, na wypadek, gdybyś zdecydował, że ich potrzebujesz. Zobacz: git reflog i git prune .