Compartilhar via


Entender a simplificação do histórico do Git

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

A simplificação do histórico git pode ser uma besta confusa. 99% do tempo que você nem sabe que existe, mas ocasionalmente ele vai saltar para fora dos cantos escuros do Git e mordê-lo. Neste artigo, exploraremos o que é simplificação de histórico e como ela pode causar confusão ao examinar o histórico de arquivos.

Vamos começar com um cenário comum:

  1. Você envia uma alteração por push para um arquivo e mescla a alteração na principal.
  2. Alguns de seus colegas também mesclam seus branches ao principal.
  3. Você volta algum tempo depois e percebe que suas alterações estão ausentes.
  4. Procurando o culpado, você vai olhar o histórico do arquivo e notar... suas alterações nem estão listadas!?

O histórico de confirmação do Git é uma árvore. Às vezes, o histórico cronológico não é o mesmo que o histórico real da árvore de arquivos. Essa situação ocorre com mais frequência quando uma confirmação de mesclagem reverte um arquivo de volta para seu estado original. Nesse caso, o modo de exibição de histórico padrão não mostrará todas as alterações, porque tecnicamente o arquivo não foi alterado. Nesse cenário, o Git percebe que pode simplificar o histórico e as "alterações" que você provavelmente está procurando são removidas do log.

A menos que você tenha se desapredo antes, você pode ficar frustrado, imaginando para onde foram minhas mudanças?

Simplificação do histórico: ativado por padrão

Por padrão, a execução do comando de log em um arquivo simplifica git log file.txt automaticamente o histórico, possivelmente ocultando algumas confirmações de sua saída. Para obter mais informações, consulte a página do log man do git.

O que aumenta a confusão é que a simplificação do histórico não ocorre se você apenas executar git log, porque você está olhando para todas as alterações não há nada para simplificar.

Para desativar a simplificação do histórico, você precisa usar o comutador --full-historyde linha de comando.

Um exemplo de simplificação de histórico

Para entender melhor como a simplificação funciona, criamos nosso próprio exemplo de simplificação de história. Primeiro, vamos examinar um diagrama do histórico que vamos criar:

Git Branches

Como você pode ver, vamos:

  1. Crie um arquivo.
  2. Adicione uma linha a esse arquivo em um branch (animais).
  3. Adicione uma linha diferente a esse arquivo em outro branch (fruta).
  4. Mesclar animais de ramificação de volta ao principal.
  5. Mesclar frutas de ramificação de volta à principal e escolher a cópia inteira do arquivo no branch de frutas.
  6. Verifique o histórico do arquivo.

O Git vai simplificar o histórico para nós. A etapa 5 é a chave aqui. Ignoramos todas as mudanças do ramo animal . O Git observará que nosso arquivo essencialmente não foi alterado entre a etapa 1 e a etapa 5 e, portanto, ele só nos mostrará duas entradas de histórico.

Primeiro, criamos o arquivo e o adicionamos ao nosso repositório:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Agora decidimos acrescentar o texto "burros" ao arquivo em um branch animal:

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Enquanto estamos experimentando, decidimos que talvez queiramos ir com frutas em nosso arquivo, então criamos um branch diferente e acrescentamos o texto "bananas" no final do arquivo em vez disso:

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Sentindo-se satisfeitos com nossas mudanças, decidimos mesclar nosso branch animal de volta ao principal:

> git checkout main
> git merge animals

Agora vamos examinar o log do nosso test.txt arquivo:

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Até agora tudo bem, certo? Nada parece fora do comum em nossa saída de log. Agora vamos dizer que mudamos de ideia e decidimos mesclar nosso ramo de frutas:

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

Um conflito de mesclagem. Após algumas considerações, decidimos usar todo test.txt o arquivo de nossa ramificação de frutas. Normalmente, você usaria algum tipo de editor de texto ou ferramenta de mesclagem, mas recriaremos o arquivo inteiro, já que são apenas duas linhas:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Agora vamos dar uma olhada no histórico do nosso test.txt arquivo:

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Com certeza, não vemos nenhuma alteração do nosso primeiro experimento no log, nem vemos nossa mesclagem! Eles ainda estão lá? O Git eliminou totalmente as alterações?

> git log --full-history test.txt

Como você pode ver, embora tenha simplificado o log sem o sinalizador, o full-history Git manteve todas as nossas alterações:

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Resumo da simplificação do histórico do Git

A coisa sobre a simplificação da história é que na maioria das vezes você nunca vai notar isso. Mas quando um conflito de mesclagem dá errado e você quer saber o que aconteceu, você pode se encontrar olhando para o histórico de logs do git e se perguntando para onde foram suas alterações.

Agora, em vez de entrar em pânico, você sabe que:

  • A simplificação de histórico para arquivos é ativada por padrão
  • O --full-history sinalizador lhe dará um histórico de arquivos mais abrangente

Atualização: desde que escrevi este artigo, o Azure DevOps Services introduziu várias opções incríveis de exibição de histórico na Web. O que isso significa é que, se você não quiser fazer logon pela linha de comando, poderá simplesmente efetuar pull do arquivo para o qual deseja exibir o histórico em nosso explorer e receberá o filtro de histórico abaixo, no qual você pode especificar exibições de histórico simples ou não simples:

Filtros do Git

(c) 2016 Microsoft Corporation. Todos os direitos reservados. Este documento é fornecido "as-is". Informações e exibições expressas neste documento, incluindo URL e outras referências de site da Internet, podem ser alteradas sem aviso prévio. Você corre o risco de usá-lo.

Este documento não fornece direitos legais a qualquer propriedade intelectual em qualquer produto da Microsoft. Você pode copiar e usar este documento para suas finalidades internas de referência.