Partilhar via


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

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

A simplificação da história do Git pode ser uma besta confusa. 99% do tempo você nem vai saber que ele existe, mas ocasionalmente ele vai saltar para fora dos cantos escuros do Git e morder você. Neste artigo, vamos explorar o que é a simplificação do histórico e como ela pode causar confusão ao olhar para o histórico de arquivos.

Vamos começar com um cenário comum:

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

A história do Git commit é 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 freqüência quando uma confirmação de mesclagem reverte um arquivo de volta ao seu estado original. Nesse caso, a visualizaçã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ê já tenha se deparado com isso antes, você pode ficar frustrado, se perguntando para onde diabos foram minhas mudanças?

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

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

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 mudanças, não há nada para simplificar.

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

Um exemplo de simplificação da história

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

Filiais Git

Como você pode ver, vamos:

  1. Crie um ficheiro .
  2. Adicione uma linha a esse arquivo em uma ramificação (animais).
  3. Adicione uma linha diferente a esse arquivo em outra ramificação (fruit).
  4. Mescle animais ramificados de volta ao principal.
  5. Mescle a fruta da ramificação de volta à principal e escolha a cópia completa do arquivo da ramificação da fruta.
  6. Verifique o histórico do arquivo.

O Git vai simplificar a história para nós. O passo 5 é a chave aqui. Nós ignoramos todas as mudanças do ramo animal . O Git notará que nosso arquivo essencialmente não mudou entre a etapa 1 e a etapa 5 e, portanto, ele nos mostrará apenas 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 anexar o texto "burros" ao arquivo em um ramo 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 ramo diferente e acrescentamos o texto "bananas" no final do arquivo:

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

Sentindo-nos satisfeitos com as nossas mudanças, decidimos fundir o nosso ramo animal de volta ao principal:

> git checkout main
> git merge animals

Agora vamos olhar para o log para o 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é aí tudo bem, né? Nada parece fora do comum em nossa saída de log. Agora digamos que mudámos de ideias e decidimos fundir o nosso ramo de fruta:

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

Uh-oh, um conflito de fusão. Depois de alguma consideração, decidimos usar todo test.txt o arquivo do nosso ramo de frutas. Normalmente, você usaria algum tipo de editor de texto ou ferramenta de mesclagem, mas vamos apenas recriar 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 mudança em relação ao nosso primeiro experimento no log, nem vemos nossa fusão! Eles ainda estão lá? O Git eliminou totalmente as mudanças?

> git log --full-history test.txt

Como você pode ver, embora tenha simplificado o log sem a bandeira, 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 notá-la. Mas quando um conflito de fusão dá errado e você quer saber o que aconteceu, você pode se encontrar olhando para o histórico do git log e se perguntando para onde foram suas alterações.

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

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

Atualização: desde que escrevi este artigo, os Serviços de DevOps do Azure introduziram várias opções incríveis de visualização de histórico na Web. O que isto significa é que, se não quiser fazer slogging através da linha de comandos, pode simplesmente puxar para cima o ficheiro para o qual deseja ver o histórico no nosso explorador e ser-lhe-á apresentado o filtro de histórico abaixo, onde pode especificar vistas de histórico simples ou não simples:

Filtros Git

(c) 2016 Microsoft Corporation. Todos os direitos reservados. Este documento é fornecido "no estado em que se encontra". As informações e opiniões expressas neste documento, incluindo URL e outras referências a sites da Internet, podem ser alteradas sem aviso prévio. O Adquirente é responsável pela utilização do mesmo.

Este documento não lhe fornece direitos legais sobre nenhuma propriedade intelectual em qualquer produto Microsoft. Poderá copiar e utilizar o presente documento para efeitos de referência pessoal a título interno.