Como inspecionar um repositório

Git status: como inspecionar um repositório

git status

O comando git status exibe as condições do diretório de trabalho e da área de staging. Ele permite que você veja quais alterações foram despreparadas, quais não foram e quais arquivos não estão sendo monitorados pelo Git. Os resultados de status não exibem qualquer informação sobre o histórico de projetos que recebeu commit. Para tal, você precisa usar o git log.

Comandos relacionados ao git

  • git tag  
    • Tags são referências que indicam pontos específicos no histórico do Git. O git tag é usado no geral para capturar um ponto no histórico usado para o lançamento de uma versão identificada (i.e. v1.0.1). 
  • git blame
    • A função de alto nível do git blame é a exibição de metadados de autor relacionados a linhas específicas em um arquivo que receberam commit. É usado para explorar o histórico de códigos específicos e mostrar qual código foi adicionado a um repositório, como e por quê.
  • git log  
    • O comando git log exibe instantâneos que receberam commit. Ele permite que você liste e filtre o histórico do projeto e pesquise alterações específicas. 

Uso

git status

Lista quais arquivos foram preparados, despreparados e não foram monitorados.

Discussão

Em termos relativos, o comando git status é simples. Ele apenas mostra o que está acontecendo com o git add e o git commit. Mensagens de status também incluem instruções relevantes para a preparação/despreparação de arquivos. Os resultados para exemplificação que exibem as três categorias principais de uma execução do git status estão incluídos abaixo:

# Na ramificação mestre
# Alterações para receber commit:
# (usar "git reset HEAD <file>..." para despreparar)
#
#modificado: hello.py
#
# Alterações não preparadas para commit:
# (usar "git add <file>..." para atualizar o que vai receber commit)
# (usar "git checkout -- <file>..." para descartar alterações no diretório de trabalho)
#
#modificado: main.py
#
# Arquivos não monitorados:
# (usar "git add <file>..." para incluir o que vai receber commit)
#
#hello.pyc

Como ignorar arquivos

Arquivos não monitorados costumam se encaixar em duas categorias. São arquivos que acabaram de ser adicionados ao projeto e ainda não receberam commit, ou são binários compilados como .pyc, .obj, .exe etc. Embora com certeza seja vantajoso incluir o primeiro tipo nos resultados do git status, a inclusão do segundo pode dificultar a visualização do que está acontecendo de fato no repositório.

Por esse motivo, o Git permite que você ignore arquivos por completo ao incluir caminhos em um arquivo especial chamado .gitignore. Quaisquer arquivos que você quer ignorar devem ser incluídos em uma linha separada, e o símbolo * pode ser usado como forma genérica. Por exemplo, a adição da linha a seguir a um arquivo .gitignore na raiz do projeto vai evitar que módulos Python compilados apareçam no git status:

*.pyc

Exemplo

É recomendável verificar as condições do repositório antes das alterações receberem commit para que isso não aconteça por acidente em algo que você não quer. Esse exemplo exibe o status do repositório antes e depois da preparação e do commit de um instantâneo:

# Editar hello.py
git status
# hello.py está listado sob "Alterações não preparadas para commit"
git add hello.py
git status
# hello.py está listado sob "Alterações a receberem commit"
git commit
git status
# nada a receber commit (diretório de trabalho limpo)

O primeiro resultado de status vai mostrar o arquivo como despreparado. A ação git add vai se refletir no segundo git status, e o resultado de status final vai informar que não há nada a receber commit—o diretório de trabalho corresponde ao commit mais recente. Alguns comandos do Git (e.g. git merge) exigem que o diretório de trabalho esteja limpo para que alterações não sejam sobrescritas por acidente.

git log

O comando git log exibe instantâneos que receberam commit. Ele permite que você liste e filtre o histórico do projeto e pesquise alterações específicas. Embora o git status permita que o diretório de trabalho e a área de staging sejam inspecionados, o git log funciona apenas com o histórico que recebeu commit.

Tutorial do Git: git status vs. git log

Os resultados de log podem ser personalizados de diversas formas, desde a filtragem simples de commits até a exibição em um formato definido pelo usuário por completo. Algumas das configurações mais comuns do git log estão apresentadas abaixo.

Uso

git log

Mostre todo o histórico de commits usando a formatação padrão. Se os resultados aparecerem em mais de uma tela, você pode usar Espaço para trocar e q para sair.

git log -n <limit>

Limite o número de commits usando <limit>. Por exemplo, git log -n 3 vai exibir apenas 3 commits.

git log --oneline

Deixe cada commit em apenas uma linha. É útil para ter uma visão geral de alto nível do histórico do projeto.

git log --stat

Junto com as informações básicas do git log, inclua os arquivos que foram alterados e o número relacionado de linhas adicionadas ou excluídas de cada um.

git log -p

Mostre o patch que representa cada commit. Essa ação mostra o diff completo de cada commit, a visão mais aprofundada que você pode ter do histórico do projeto.

git log --author="<pattern>"

Pesquise commits por autor. O argumento <pattern> pode ser uma sequência simples ou uma expressão regular.

git log --grep="<pattern>"

Pesquise commits com uma mensagem de commit que corresponde ao <pattern>, que pode ser uma sequência simples ou uma expressão regular.

git log <since>..<until>

Mostre apenas commits que ocorrem <since> e <until>. Ambos os argumentos podem ser um ID de commit, um nome de ramificação, HEAD ou qualquer outro tipo de referência de revisão.

git log <file>

Mostre apenas commits que incluem o arquivo especificado. É um jeito fácil de ver o histórico de um arquivo em particular.

git log --graph --decorate --oneline

Algumas opções úteis a serem consideradas. A flag --graph traça um gráfico com base em texto dos commits no lado esquerdo das mensagens de commit. A opção --decorate adiciona os nomes das ramificações ou tags dos commits exibidos. A opção --oneline mostra informações sobre os commits em uma única linha, facilitando a navegação rápida entre commits.

Discussão

O comando git log é a ferramenta básica do Git para explorar o histórico de um repositório. É usado quando se precisa encontrar uma versão específica de um projeto ou saber quais alterações vão ser implantadas através da merge de uma ramificação de recurso.

commit 3157ee3718e180a9476bf2e5cab8e3f1e78a73b7
Autor: John Smith

Boa parte disso é bem simples; contudo, é necessária certa explicação sobre a primeira linha. A sequência de 40 caracteres após commit é uma soma de verificação SHA-1 dos conteúdos do commit. Tem dois objetivos. Primeiro, garante a integridade do commit—se estiver corrompido, o commit gera uma soma de verificação diferente. Segundo, funciona como um ID exclusivo do commit.

Esse ID pode ser usado em comandos como git log <since>..<until> para indicar commits específicos. For exemplo, git log 3157e..5ab91 vai exibir tudo entre os commits com os ID's 3157e e 5ab91. Além das somas de verificação, nomes de ramificações (abordadas no Módulo de Ramificações) e a palavra-chave HEAD são outros métodos comuns para indicar commits individuais. HEAD sempre se refere ao commit atual, seja uma ramificação ou um commit específico.

O caractere ~ é útil para se fazerem referências relativas ao pai de um commit. Por exemplo, 3157e~1 se refere ao commit antes de 3157e, e HEAD~3 é o bisavô do commit atual.

A ideia por trás de todos esses métodos de verificação é permitir que se realizem ações com base em commits específicos. O comando git log é o ponto de partida comum dessas interações, já que permite que sejam encontrados os commits com os quais se quer trabalhar.

Exemplo

A seção Uso apresenta muitos exemplos do git log, mas é importante lembrar que diversas opções podem ser combinadas com um único comando:

git log --author="John Smith" -p hello.py

Esse comando vai exibir um diff completo de todas as alterações que o John Smith fez no arquivo hello.py.

A sintaxe .. é uma ferramenta muito útil para a comparação entre ramificações. O exemplo a seguir apresenta um panorama simplificado de todos os commits que estão em some-feature que não estão em master.

git log --oneline master..some-feature

Pronto(a) para aprender o git status?

Tente este tutorial interativo.

Comece agora mesmo