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:
- Você envia uma alteração para um arquivo e, em seguida, mescla a alteração na principal.
- Alguns de seus colegas também fundem suas filiais para a principal.
- Você volta algum tempo depois e percebe que suas alterações estão faltando.
- 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-history
de 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:
Como você pode ver, vamos:
- Crie um ficheiro .
- Adicione uma linha a esse arquivo em uma ramificação (animais).
- Adicione uma linha diferente a esse arquivo em outra ramificação (fruit).
- Mescle animais ramificados de volta ao principal.
- Mescle a fruta da ramificação de volta à principal e escolha a cópia completa do arquivo da ramificação da fruta.
- 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:
(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.