Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Você envia uma alteração por push para um arquivo e mescla a alteração na principal.
- Alguns de seus colegas também mesclam seus branches ao principal.
- Você volta algum tempo depois e percebe que suas alterações estão ausentes.
- 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:
Como você pode ver, vamos:
- Crie um arquivo.
- Adicione uma linha a esse arquivo em um branch (animais).
- Adicione uma linha diferente a esse arquivo em outro branch (fruta).
- Mesclar animais de ramificação de volta ao principal.
- Mesclar frutas de ramificação de volta à principal e escolher a cópia inteira do arquivo no branch de frutas.
- 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-historysinalizador 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:
(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.