Close

Log avançado do Git

O objetivo de qualquer sistema de controle de versão é registrar as alterações no seu código. Isso lhe dá o poder de voltar ao histórico do seu projeto para ver quem contribuiu com o quê, descobrir onde os bugs foram introduzidos e reverter alterações problemáticas. Mas, ter todo esse histórico disponível é inútil se você não sabe como navegar por ele. É aí que entra o comando git log.

Até agora, você já deve conhecer o comando git log básico para exibir commits. Mas você pode alterar essa saída passando muitos parâmetros diferentes para o git log.

As características avançadas do git log podem ser divididas em duas categorias: formatar como cada commit é exibido e filtrar quais commits estão incluídos na saída. Juntas, essas duas habilidades dão a você o poder de voltar ao seu projeto e encontrar qualquer informação que você possa precisar.


Formatação da saída do log


Primeiro, este artigo vai examinar as várias maneiras pelas quais a saída do git log pode ser formatada. A maioria deles vem na forma de marcações que permitem solicitar mais ou menos informações do git log.

Se não gostar do formato padrão do git log, você pode usar a funcionalidade de alias do git config para criar um atalho para qualquer uma das opções de formatação discutidas abaixo. Veja no material sobre comando git config como configurar um alias.

Uma linha

A marcação --oneline condensa cada commit em uma única linha. Por padrão, ele exibe apenas o ID do commit e a primeira linha da mensagem do commit. Uma saída típica do git log --oneline vai ser parecida com esta:

0e25143 Merge branch 'feature'
ad8621a Fix a bug in the feature
16b36c6 Add a new feature
23ad9ad Add the initial code base

Isso é muito útil para obter uma visão geral de alto nível do seu projeto.

bancos de dados
Material relacionado

Como mover um Repositório do Git completo

Logotipo do Bitbucket
VER SOLUÇÃO

Aprenda a usar o Git com o Bitbucket Cloud

Decorar

Muitas vezes é útil saber a qual branch ou tag cada commit está associado. A marcação --decorate faz com que o git log exiba todas as referências (por exemplo, branches, tags, etc.) que apontam para cada commit.

Essa opção de configuração pode ser combinada com outras. Por exemplo, executar o git log --oneline --decorate vai formatar o histórico de commits da seguinte forma:

0e25143 (HEAD, main) Merge branch 'feature'
ad8621a (feature) Fix a bug in the feature
16b36c6 Add a new feature
23ad9ad (tag: v0.9) Add the initial code base

Assim você sabe que o commit superior também foi verificado (indicado por HEAD) e que também é a ponta do branch main. O segundo commit tem outro branch apontando para ele chamado feature e, finalmente, o 4º commit é marcado como v0.9.

Branches, tags, HEAD e o histórico de commits são quase todas as informações contidas no seu Repositório do Git, então isso dá a você uma visão mais completa da estrutura lógica do seu repositório.

Comparações

O comando git log inclui muitas opções para exibir comparações com cada commit. Duas das opções mais comuns são --stat e -p.

A opção --stat exibe o número de inserções e exclusões para cada arquivo alterado por cada commit (observe que a modificação de uma linha é representada como 1 inserção e 1 exclusão). É útil quando você quer um breve resumo das alterações introduzidas por cada commit. Por exemplo, o seguinte commit adicionou 67 linhas ao arquivo hello.py e removeu 38 linhas:

commit f2a238924e89ca1d4947662928218a06d39068c3
Author: John <john@example.com>
Date:   Fri Jun 25 17:30:28 2014 -0500

    Add a new feature

 hello.py | 105 ++++++++++++++++++++++++-----------------
 1 file changed, 67 insertion(+), 38 deletions(-)

A quantidade de sinais + e - ao lado do nome do arquivo mostra o número relativo de alterações em cada arquivo alterado pelo commit. Isso lhe dá uma ideia de onde as alterações para cada commit podem ser encontradas.

Se você quiser ver as mudanças reais introduzidas por cada commit, você pode passar a opção -p para o git log. Isso gera todo o patch representando esse commit:

commit 16b36c697eb2d24302f89aa22d9170dfe609855b
Author: Mary <mary@example.com>
Date:   Fri Jun 25 17:31:57 2014 -0500

    Fix a bug in the feature

diff --git a/hello.py b/hello.py
index 18ca709..c673b40 100644
--- a/hello.py
+++ b/hello.py
@@ -13,14 +13,14 @@ B
-print("Hello, World!")
+print("Hello, Git!")

Para commits com muitas alterações, a saída resultante pode se tornar bastante longa e difícil de manejar. Na maioria das vezes, se você estiver exibindo um patch completo, provavelmente está buscando uma alteração específica. Então, use a opção de "pickaxe".

O Shortlog

O comando git shortlog é uma versão especial do git log destinada a criar anúncios de lançamento. Ele agrupa cada commit por autor e exibe a primeira linha de cada mensagem de commit. Essa é uma maneira fácil de ver quem está trabalhando em quê.

Por exemplo, se dois desenvolvedores contribuíram com 5 commits para um projeto, a saída do git shortlog pode ser a seguinte:

Mary (2):
      Fix a bug in the feature
      Fix a serious security hole in our framework

John (3):
      Add the initial code base
      Add a new feature
      Merge branch 'feature'

Por padrão, o git shortlog classifica a saída pelo nome do autor, mas você também pode passar a opção -n para classificar pelo número de commits por autor.

gráficos

A opção --graph desenha um gráfico ASCII representando a estrutura de branch do histórico de commits. Ela costuma ser usada em conjunto com os comandos --oneline e --decorate para facilitar a visualização de qual commit pertence a qual branch:

git log --graph --oneline --decorate

Para um repositório simples com apenas dois branches, o resultado vai ser o seguinte:

*   0e25143 (HEAD, main) Merge branch 'feature'
|\  
| * 16b36c6 Fix a bug in the new feature
| * 23ad9ad Start a new feature
* | ad8621a Fix a critical security issue
|/  
* 400e4b7 Fix typos in the documentation
* 160e224 Add the initial code base

O asterisco mostra em qual branch o commit estava, então o gráfico acima diz que os commits 23ad9ad e 16b36c6 estão em um branch de tópico e o restante está no branch main.

Embora essa seja uma boa opção para repositórios simples, você provavelmente está melhor com uma ferramenta de visualização mais completa, como gitk ou Sourcetree para projetos que têm muitos branches.

Formatação personalizada

Para todas as suas outras necessidades de formatação do git log, você pode usar a opção --pretty=format:"". Assim você pode exibir cada commit da maneira que quer usando espaços reservados no estilo printf.

Por exemplo, os caracteres %cn, %h e %cd no comando a seguir são substituídos pelo nome do committer, pelo hash do commit abreviado e pela data do committer, respectivamente.

git log --pretty=format:"%cn committed %h on %cd"

Isso resulta no seguinte formato para cada commit:

John committed 400e4b7 on Fri Jun 24 12:30:04 2014 -0500 John committed 89ab2cf on Thu Jun 23 17:09:42 2014 -0500 Mary committed 180e223 on Wed Jun 22 17:21:19 2014 -0500 John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500

A lista completa de espaços reservados pode ser encontrada na seção Formatos bonitos da página de manual do git log.

Além de permitir que você visualize apenas as informações de seu interesse, a opção --pretty=format:"" é particularmente útil quando você está tentando canalizar a saída do git log para outro comando.

Filtragem do histórico de commits


Formatar como cada commit é exibido é apenas metade da batalha de aprender git log. A outra metade é entender como navegar pelo histórico de commits. O restante deste artigo apresenta algumas das maneiras avançadas de escolher commits específicos no histórico do seu projeto usando o git log. Tudo isso pode ser combinado com qualquer uma das opções de formatação discutidas acima.

Por quantidade

A opção de filtragem mais básica para o git log é limitar o número de commits exibidos. Quando você está interessado apenas nos últimos commits, isso poupa o trabalho de visualizar todos os commits em uma página.

Você pode limitar a saída do git log incluindo a opção -. Por exemplo, o comando a seguir vai exibir apenas os três commits mais recentes.

git log -3

Por data

Se você estiver procurando por um commit de um período específico, você pode usar as marcações --after ou --before para filtrar commits por data. Ambos aceitam uma variedade de formatos de data como parâmetro. Por exemplo, o comando a seguir mostra apenas os commits que foram criados após 1º de julho de 2014 (inclusive):

git log --after="2014-7-1"

Você também pode passar referências relativas como "1 semana atrás" e "ontem":

git log --after="yesterday"

Para pesquisar commits que foram criados entre duas datas, você pode indicar uma data --before e uma --after. Por exemplo, para exibir todos os commits adicionados entre 1º de julho de 2014 e 4 de julho de 2014, você usaria o seguinte:

git log --after="2014-7-1" --before="2014-7-4"

Para commits com muitas alterações, a saída resultante pode se tornar bastante longa e difícil de manejar. Na maioria das vezes, se você estiver exibindo um patch completo, provavelmente está buscando uma alteração específica. Então, use a opção de "pickaxe".

Por autor

Quando você estiver procurando apenas por commits criados por um usuário específico, use a marcação --author. Isso aceita uma expressão regular e retorna todos os commits cujo autor corresponde a esse padrão. Se você sabe exatamente quem está procurando, você pode usar uma cadeia de caracteres antiga simples em vez de uma expressão regular:

git log --author="John"

Isso exibe todos os commits cujo autor inclui o nome John. O nome do autor não precisa ser uma correspondência exata — ele só precisa conter a frase especificada.

Você também pode usar expressões regulares para criar pesquisas mais complexas. Por exemplo, o comando a seguir procura por commits feitos por Mary ou John.

git log --author="John\|Mary"

Observe que o e-mail do autor também está incluído com o nome do autor, para que você possa usar essa opção para pesquisar por e-mail também.

Se o fluxo de trabalho separa os committers dos autores, a marcação --committer vai funcionar da mesma maneira.

Por mensagem

Para filtrar os commits por sua mensagem de commit, use a marcação --grep. O funcionamento é exatamente o mesmo daquele da marcação --author discutido acima, mas combina com a mensagem do commit em vez do autor.

Por exemplo, se sua equipe incluir números de itens relevantes em cada mensagem de commit, você vai poder usar algo como o seguinte para extrair todos os commits relacionados a esse item:

git log --grep="JRA-224:"

Você também pode passar o parâmetro -i para o git log para fazer com que ele ignore as diferenças de maiúsculas e minúsculas durante a correspondência de padrões.

Por arquivo

Muitas vezes, você só está interessado nas mudanças que aconteceram em um determinado arquivo. Para mostrar o histórico relacionado a um arquivo, tudo o que você precisa fazer é passar o caminho do arquivo. Por exemplo, o seguinte retorna todos os commits que afetaram o arquivo foo.py ou bar.py:

git log -- foo.py bar.py

O parâmetro -- é usado para informar ao git log que os argumentos subsequentes são caminhos de arquivo e não nomes de branches. Se não houver possibilidade de fazer confusão com um branch, você pode omitir o --.

Por conteúdo

Também é possível pesquisar por commits que introduzem ou removem uma determinada linha de código-fonte. Isso é chamado de pickaxe e assume a forma de -S"". Por exemplo, se você quiser saber quando a cadeia de texto Hello, World! foi adicionada a qualquer arquivo no projeto, você usaria o seguinte comando:

git log -S"Hello, World!"

Se você quiser pesquisar usando uma expressão regular em vez de uma cadeia de caracteres, você pode usar a marcação -G"".

Esta é uma ferramenta de depuração muito poderosa, pois permite localizar todos os commits que afetam uma determinada linha de código. Pode até mostrar quando uma linha foi copiada ou movida para outro arquivo.

Por intervalo

Você pode passar um intervalo de commits para o git log para mostrar apenas os commits contidos nesse intervalo. O intervalo é especificado no seguinte formato, onde e são referências de commit:

git log ..

Esse comando é particularmente útil quando você usa referências de branch como parâmetros. É uma maneira simples de mostrar as diferenças entre dois branches. Considere o seguinte comando:

git log main..feature

O intervalo main..feature contém todos os commits que estão no branch do feature, mas não estão no branch main. Em outras palavras, é o progresso que o feature alcançou desde que se separou do main. Você pode visualizar isso da seguinte forma:

Detectando uma bifurcação no histórico usando intervalos

Note que se você mudar a ordem do intervalo (feature..main), você vai obter todos os commits em main, mas não em feature. Se o git log gerar commits para ambas as versões, isso indica que seu histórico divergiu.

Filtragem de commits de merge

Por padrão, o git log inclui commits de merge no resultado. Mas, se sua equipe tiver uma política de merge contínuo (ou seja, você fizer merge das alterações upstream em branches de tópico em vez de fazer o rebase do branch de tópico no branch upstream), você vai ter muitos commits de merge estranhos no histórico do projeto.

Você pode impedir que o git log exiba esses commits de merge passando a marcação --no-merges:

git log --no-merges

Por outro lado, se você tiver interesse apenas nos commits de merge, você pode usar a marcação --merges:

git log --merges

Isso retorna todos os commits que têm pelo menos dois pais.

Resumo


Agora você deve estar bastante confortável usando os parâmetros avançados do git log para formatar sua saída e selecionar quais commits quer exibir. Isso dá a você o poder de extrair exatamente o que você precisa do histórico do seu projeto.

Essas novas habilidades são uma parte importante do seu kit de ferramentas do Git, mas lembre-se de que o git log é frequentemente usado em conjunto com outros comandos do Git. Depois de encontrar o commit que você está procurando, você normalmente o passa para git checkout, git revert ou alguma outra ferramenta para manipular seu histórico de commits. Portanto, continue aprendendo sobre as características avançadas do Git.


Compartilhar este artigo
Próximo tópico

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Pessoas colaborando usando uma parede cheia de ferramentas

Blog do Bitbucket

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Demonstrações de funções no Demo Den com parceiros da Atlassian

Como o Bitbucket Cloud funciona com o Atlassian Open DevOps

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up