Apesar do fato de o GIT NÃO armazenar deltas de arquivos, você ainda pode reverter para versões de arquivos anteriores (tempos ilimitados?)

14

Eu li que o Git não armazena deltas de arquivos. Se isso for verdade, como ele suporta a reversão de arquivos para versões anteriores? Se estiver armazenando o arquivo inteiro, o espaço do repositório no disco deve crescer para ser incontrolável. O Git suporta rollbacks e diff (s) de arquivos de volta para a versão 1 do arquivo? Será que ainda suporta um conceito de versionamento relacionado a arquivos? Isso é (eu acredito) essencial para minha compreensão de um VCS / DVCS e minhas necessidades. Eu preciso ser capaz de comparar o que estou prestes a verificar com versões anteriores.

    
por Pete Alvin 28.06.2010 / 13:41

3 respostas

41

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 .

    
por 02.07.2010 / 11:15
1

Pode ser lido na mesma página:

...

Consequently, Git does not explicitly record file revision relationships at any level below the source code tree.

...

It is slightly more expensive to examine the change history of a single file than the whole project. To obtain a history of changes affecting a given file, Git must walk the global history and then determine whether each change modified that file. This method of examining history does, however, let Git produce with equal efficiency a single history showing the changes to an arbitrary set of files. For example, a subdirectory of the source tree plus an associated global header file is a very common case.

...

Assim, você pode voltar às revisões anteriores de um arquivo e comparar dois arquivos.

    
por 28.06.2010 / 13:56
1

git de fato salva deltas de arquivos, mas os salva como um delta de toda a árvore de arquivos.

Para ver as diferenças entre as versões, siga um destes procedimentos:

  1. git diff - mostra as diferenças entre a última versão com check-in e os arquivos que foram alterados, mas não teve git add executado neles.
  2. git diff --cached - mostra as diferenças entre a versão anterior e o que todos os arquivos que tiveram git add são executados, mas não foram confirmados
  3. git diff commitid - mostra as diferenças entre o diretório de trabalho atual e um commit anterior como especificado com o commitid
  4. git diff commita..commitb - mostra as diferenças entre dois commits, aeb. Os commits também podem ser nomes simbólicos, como branches ou tags.
por 24.07.2010 / 18:07