Como inspecionar o histórico de um projeto com o registro Git

Um dos serviços mais fundamentais fornecidos pelo Git é o histórico do projeto. Como o Git acompanha todas as alterações feitas em um repositório, ele pode oferecer recursos de registro muito poderosos. Você pode consultar o histórico de um projeto de muitas maneiras diferentes e pode extrair e exibir vários dados usando um comando flexível.

O comando git log é enorme, o maior de qualquer comando Git regular. Seu manual tem mais de 2.500 linhas. Felizmente, o git log fornece muito de seu comportamento mais útil a partir de apenas algumas opções principais.

Log básico com o comportamento padrão

Por padrão, o git log mostra uma lista cronológica reversa de commits. Cada confirmação inclui seu hash, autor, data e mensagem de confirmação:

O comando usa um pager (por exemplo, menos, mais) para mostrar a saída completa para que você possa navegar facilmente pelos resultados. Você pode configurar o Git para usar um programa de sua escolha, como o mais pager .

Aqui estão algumas saídas de log do git do repositório do próprio código-fonte do git :

 commit 670b81a890388c60b7032a4f5b879f2ece8c4558 (HEAD -> master, origin/next,
origin/master, origin/HEAD)
Author: Junio C Hamano <[email protected]>
Date: Mon Jun 14 13:23:28 2021 +0900
The second batch
Signed-off-by: Junio C Hamano <[email protected]>

O resultado começa com o hash do commit ( 670 …) seguido por uma lista de branches que atualmente apontam para aquele commit ( HEAD -> master , etc.)

A próxima linha descreve o autor deste commit, dando seu nome e endereço de e-mail.

A data e hora completas do commit seguem na próxima linha.

Finalmente, o conteúdo completo da mensagem de confirmação aparece. Você pode controlar quase tudo o mais que o git log oferece com opções de linha de comando. Existem dois tipos principais de opções:

  • Formatação, que define como o Git exibe cada commit.
  • Filtragem, que define quais commits o git log inclui.

Além das opções de linha de comando, o git log aceita argumentos que especificam arquivos, commits, branches ou outros tipos de referência. Isso aplica mais filtragem.

Formatando saída de log Git

Um dos ajustes mais simples é a opção –oneline que produz uma saída muito breve:

 git log --oneline

Cada linha no log agora contém apenas um hash de confirmação abreviado e o assunto da mensagem de confirmação . Esta é uma excelente maneira de obter uma visão geral dos compromissos recentes do projeto:

Infelizmente, sem outro contexto, essas informações nem sempre são tão úteis. Pode dar uma ideia vaga do projeto, mas faltam datas e outras informações úteis sobre autores e arquivos.

Visualizando um Gráfico de Ramificação

A opção –graph permite que você visualize relacionamentos entre ramos. É muito básico, mas pode ajudar a desvendar uma história complicada.

 git log --oneline --graph

Relacionado: Como Criar um Novo Branch no Git

Resultado bonito personalizado

Você pode obter uma formatação mais complicada especificando-a em detalhes usando a opção –pretty . A sintaxe vai de muito simples a muito mais complexa, portanto, consulte um manual para obter os detalhes completos .

 git log --pretty=short

É essencialmente o mesmo que git log sem a data ou a mensagem completa:

 git log --pretty=oneline

É equivalente a git log –oneline .

 git log --pretty=fuller

Inclui muitos detalhes. Até separa o autor e o autor do commit que podem, em teoria, ser pessoas diferentes:

Com o formato: variant, você pode fornecer uma string contendo qualquer conteúdo que desejar, incluindo marcadores de posição que são substituídos por vários dados. Aqui estão alguns exemplos de marcadores de posição:

  • % H commit hash
  • % h hash de confirmação abreviado
  • % data do autor do anúncio
  • % ar data do autor, relativa
  • % s enviar assunto da mensagem
  • % b enviar corpo da mensagem
  • % p hashes parentes abreviados

Você pode adicionar caracteres fixos à saída e colorir. Este exemplo também mostra uma variação no formato da data:

 git log --pretty=format:'%C(auto) %h [%ad] %s' --date=short

Observe que os colchetes circundam a data. Qualquer que seja a formatação escolhida, se quiser que a saída seja útil em um pipeline ou para outras formas de processamento de texto, você deve considerar como demarcar cada parte da saída.

Mostrando diferenças no registro

Um detalhe importante ao olhar para o histórico de um repositório são os próprios diffs. Afinal, eles representam o que realmente mudou no código! Para começar, você pode obter um resumo das alterações ao lado de cada commit usando –shortstat :

 git log --shortstat

Isso adiciona uma linha como:

 1 file changed, 48 insertions(+), 2 deletions(-)

No final de cada commit. Você frequentemente verá esse tipo de resumo – em todas as páginas do GitHub, por exemplo – e é uma maneira útil de julgar rapidamente o escopo de um commit específico. Para obter informações mais detalhadas, você pode incluir saída de patch completo (diffs) usando o sinalizador -p :

 git log -p

Filtrando a saída do log Git

Qualquer que seja a formatação que você aplicar, você ainda verá o log completo de todos os commits no branch atual. Mesmo que o Git os divida em páginas, ainda pode ser uma grande quantidade de saída. As opções a seguir permitem que você personalize quais commits o log inclui.

Restringindo por Quantidade

Se você deseja apenas cortar os resultados para mostrar os poucos commits mais recentes, use a sintaxe – [número] :

 git log -2

Restringindo por Data

Para restringir o conjunto de commits para um determinado intervalo de datas, utilize o –since opções (–após) e –until (–before). Cada um deles leva uma data no formato ISO 8601. Você pode usar –since ou –until por conta própria, ou ambos juntos para especificar um intervalo. As opções –after e –before são sinônimos.

 git log --since="2021-01-01" --until="2021-05-01"

Restringindo por arquivo

O log do Git pode se concentrar em um arquivo específico, em vez de em cada arquivo em seu repositório. Isso é ótimo para ajudá-lo a descobrir como um arquivo específico mudou ao longo do tempo. Basta anexar o nome do arquivo ao final do seu comando git:

 git log filename

Você verá apenas os commits que afetaram o nome do arquivo .

Diferenças entre ramos

Você pode ter alguns requisitos exclusivos ao visualizar o log de uma filial. Por exemplo, em vez de ver todo o histórico, você pode querer apenas ver o que mudou naquele branch específico. O log do Git pode ajudar por meio da sintaxe ref1..ref2 . Existem três abordagens ligeiramente diferentes que você pode usar:

  1. Veja os commits que estão no main, mas não no branch:
     git log --oneline origin/branch..origin/main
  2. Veja os commits que estão no branch, mas não no principal:
     git log --oneline origin/ main ..origin/ branch
  3. Veja os commits que existem apenas no branch ou principal:
     git log --oneline origin/branch ... origin/main

Diferenças entre duas tags

Assim como você pode ver o histórico entre os ramos usando a sintaxe ref1..ref2 , você também pode ver o histórico entre as tags da mesma maneira. Afinal, tanto tags quanto branches são tipos de referência.

 git log --abbrev-commit --pretty=format:'%h %ar %s' v2.32.0-rc3..v2.32.0

Se você está preparando notas de lançamento para um projeto maior, o git shortlog deve ser sua primeira parada . Ele produz uma lista de autores com assuntos comprometidos ao lado deles. Você pode passar um intervalo de referência para limitar o histórico de maneira semelhante ao git log:

 git shortlog v2.32.0-rc3..v2.32.0

O comando git show é ainda mais versátil que o git log . Ele pode trabalhar com tags e outros tipos de objetos git além do histórico de commits. Ele compartilha muitas opções com o git log , mas você só precisará dele realmente se precisar se aprofundar nos detalhes de nível inferior.

Revise o passado com o registro do Git

Git log é um comando complicado, mas você pode obter muito uso de suas opções mais básicas. Navegar no histórico de um repositório é uma excelente maneira de entender com que frequência as mudanças ocorrem e quantas pessoas as fazem. Depois de ter um bom entendimento da história de um projeto, você estará em uma ótima posição para contribuir com ele.