O Git não descarta informações por si só *. Todas as versões anteriores de todos os arquivos estão sempre disponíveis para reversões, diferenças, inspeções etc.
Árvore inteira versus arquivos individuais
O que você pode estar tentando reconciliar é a idéia de acessar uma versão antiga de um arquivo individual versus o fato de o modelo de histórico do Git estar focado em toda a árvore. O controle de versão de árvore inteira exige um pouco mais de trabalho para ver (por exemplo) a versão foo.c
como ela existia foo.c
há dez alterações atrás, e dez alterações de árvore inteira atrás:
# 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
Os benefícios da orientação em árvore, principalmente a capacidade de visualizar os commits como uma unidade de alterações interdependentes feitas em várias partes da árvore, geralmente superam em muito a digitação extra (que pode ser aliviada com aliases, scripts etc.) e o tempo da CPU gasto cavando através de confirmações passadas.
Eficiência de armazenamento
Quando um novo objeto (por exemplo, um arquivo com conteúdo não visto anteriormente) entra no sistema, ele é armazenado com compressão simples (zlib) como um “objeto solto”. Quando objetos soltos suficientes se acumulam (com base na gc.auto
opção de configuração; ou quando o usuário executa o git gc ou um dos comandos de compactação de nível inferior), o Git coleta muitos objetos soltos em um único "arquivo de pacote".
Os objetos em um arquivo de pacote podem ser armazenados como dados compactados simples (o mesmo que um objeto solto, apenas empacotado com outros objetos) ou como deltas compactados em relação a outro objeto. Os deltas podem ser encadeados em profundidades configuráveis ( pack.depth
) e podem ser criados contra qualquer objeto adequado ( pack.window
controla a extensão em que o Git pesquisa a melhor base delta; uma versão de um arquivo historicamente não relacionado pode ser usada como base, se isso produzir um boa compactação delta). A latitude que as configurações de profundidade e tamanho da janela fornecem ao mecanismo de compactação delta geralmente resulta em uma compactação delta melhor do que na compactação "diff" simples de uma versão contra a próxima / versão anterior no estilo CVS.
É essa compactação delta agressiva (combinada com a compactação zlib normal) que geralmente permite que um repositório Git (com histórico completo e uma árvore de trabalho descompactada) ocupe menos espaço que um único check-out de SVN (com árvore de trabalho descompactada e cópia intocada).
Veja as seções Como o Git armazena objetos e O arquivo de pacotes do The Git Community Book . Também a página de manual git pack-objects .
* Você pode dizer ao Git que joga fora os commits “reescrevendo o histórico” e com comandos como git reset , mas mesmo nesses casos o Git “agarra” os recém-descartados por um tempo, apenas no caso de você decidir que precisa deles. Veja git reflog e git ameixa .