O Git não elimina informações sozinho *. Todas as versões anteriores de todos os arquivos estão sempre disponíveis para reversões, testes, inspeções, etc.
Árvore inteira versus arquivos individuais
O que você pode estar tentando reconciliar é a ideia de acessar uma versão antiga de um arquivo individual versus o fato de que o modelo de histórico do Git está focado na árvore inteira. O versionamento de toda a árvore requer um pouco mais de trabalho para ver (por exemplo) a versão de foo.c
, já que existiam dez foo.c
-changes atrás versus dez mudanças 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 de árvore, principalmente a capacidade de ver os commits como uma unidade de mudanças interdependentes feitas em várias partes da árvore inteira, geralmente superam em muito a tipagem extra (que pode ser aliviada com aliases, scripts, etc.) e o tempo de CPU gasto cavando através de commits anteriores.
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 compactação simples (zlib) como um "objeto solto". Quando bastante objetos soltos se acumulam (com base na opção de configuração gc.auto
; ou quando o usuário executa git gc ou um dos comandos de empacotamento de nível inferior), o Git coleta muitos objetos soltos em um único “ pacote de arquivos ".
Os objetos em um arquivo de pacote podem ser armazenados como dados compactados simples (o mesmo que um objeto solto, apenas agrupados 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 feitos contra qualquer objeto adequado ( pack.window
controla o quanto 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 uma boa compressão delta). A latitude que as configurações de profundidade e tamanho da janela fornecem ao mecanismo de compressão delta geralmente resulta em uma melhor compressão delta do que a compactação simples “diff” de uma versão contra a próxima / versão anterior do 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 não compactada) ocupe menos espaço do que uma única verificação SVN (com árvore de trabalho não compactada e cópia original) .
Veja como Como o Git armazena objetos e As seções do Packfile do The Git Community Book . Também o git pack-objects manpage .
* Você pode dizer ao Git que jogue fora commits por “reescrever histórico” e com comandos como git reset , mas mesmo nesses casos o Git “trava” os commits recém descartados por um tempo , caso você decida que precisa deles. Veja git reflog e git podar .