-
1. Primeiros Passos
- 1.1 Sobre Controle de Versão
- 1.2 Uma Breve História do Git
- 1.3 O que é Git?
- 1.4 A Linha de Comando
- 1.5 Instalando o Git
- 1.6 Configuração inicial do Git
- 1.7 Obtendo Ajuda
- 1.8 Resumo
-
2. Fundamentos do Git
-
3. Ramificação (Branching) no Git
-
4. Git no Servidor
- 4.1 Os Protocolos
- 4.2 Colocando o Git em um Servidor
- 4.3 Gerando a sua Chave Pública SSH
- 4.4 Configurando o Servidor
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Opções de Hospedagem de Terceiros
- 4.10 Resumo
-
5. Git Distribuído
-
6. GitHub
-
7. Ferramentas do Git
- 7.1 Seleção de Revisão
- 7.2 Área de Stage Interativa
- 7.3 Fazendo Stash e Limpando
- 7.4 Assinando Seu Trabalho
- 7.5 Pesquisando (Searching)
- 7.6 Reescrevendo o Histórico
- 7.7 Reset Desmistificado
- 7.8 Merging Avançado
- 7.9 Rerere
- 7.10 Depurando com Git
- 7.11 Submódulos
- 7.12 Empacotando (Bundling)
- 7.13 Substituir (Replace)
- 7.14 Armazenamento de Credenciais
- 7.15 Resumo
-
8. Customizando o Git
- 8.1 Configuração do Git
- 8.2 Atributos do Git
- 8.3 Hooks do Git
- 8.4 Uma Política de Exemplo Imposta pelo Git
- 8.5 Resumo
-
9. Git e Outros Sistemas
- 9.1 Git como Cliente
- 9.2 Migrando para o Git
- 9.3 Resumo
-
10. Git Internals (Por Dentro do Git)
- 10.1 Encanamento e Porcelana (Plumbing and Porcelain)
- 10.2 Objetos do Git
- 10.3 Referências do Git
- 10.4 Arquivos de pacote (Packfiles)
- 10.5 Refspec
- 10.6 Protocolos de Transferência
- 10.7 Manutenção e Recuperação de Dados
- 10.8 Variáveis de Ambiente
- 10.9 Resumo
-
A1. Appendix A: O Git em Outros Ambientes
- A1.1 Interfaces Gráficas
- A1.2 Git no Visual Studio
- A1.3 Git no Visual Studio Code
- A1.4 Git no IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git no Sublime Text
- A1.6 Git no Bash
- A1.7 Git no Zsh
- A1.8 Git no PowerShell
- A1.9 Resumo
-
A2. Appendix B: Incorporando o Git nos seus Aplicativos
- A2.1 Linha de Comando do Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Comandos do Git
- A3.1 Configuração e Ajustes
- A3.2 Obtendo e Criando Projetos
- A3.3 Snapshots Básicos
- A3.4 Branches e Merges
- A3.5 Compartilhando e Atualizando Projetos
- A3.6 Inspeção e Comparação
- A3.7 Depuração
- A3.8 Patches
- A3.9 E-mail
- A3.10 Sistemas Externos
- A3.11 Administração
- A3.12 Comandos de Encanamento
2.3 Fundamentos do Git - Visualizando o Histórico de Commits
Visualizando o Histórico de Commits
Depois de criar vários commits, ou se você tiver clonado um repositório com um histórico de commits existente, você provavelmente vai querer olhar para trás para ver o que aconteceu.
A ferramenta mais básica e poderosa para fazer isso é o comando git log.
Estes exemplos usam um projeto muito simples chamado “simplegit”. Para obter o projeto, execute:
$ git clone https://github.com/schacon/simplegit-progit
Quando você executa git log neste projeto, você deve obter uma saída semelhante a esta:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
Por padrão, sem argumentos, o git log lista os commits feitos naquele repositório em ordem cronológica reversa; ou seja, os commits mais recentes aparecem primeiro.
Como você pode ver, este comando lista cada commit com seu checksum SHA-1, o nome e e-mail do autor, a data em que foi escrito e a mensagem de commit.
Um grande número e variedade de opções para o comando git log estão disponíveis para mostrar exatamente o que você está procurando.
Aqui, mostraremos a você algumas das mais populares.
Uma das opções mais úteis é -p ou --patch, que mostra a diferença (a saída do patch) introduzida em cada commit.
Você também pode limitar o número de entradas de log exibidas, como usar -2 para mostrar apenas as duas últimas entradas.
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
end
end
-
-if $0 == __FILE__
- git = SimpleGit.new
- puts git.show
-end
Esta opção exibe as mesmas informações, mas com um diff logo após cada entrada.
Isso é muito útil para revisão de código ou para navegar rapidamente pelo que aconteceu durante uma série de commits que um colaborador adicionou.
Você também pode usar uma série de opções de resumo com o git log.
Por exemplo, se você quiser ver algumas estatísticas abreviadas para cada commit, pode usar a opção --stat:
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
lib/simplegit.rb | 5 -----
1 file changed, 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
Como você pode ver, a opção --stat imprime abaixo de cada entrada de commit uma lista de arquivos modificados, quantos arquivos foram alterados e quantas linhas nesses arquivos foram adicionadas e removidas.
Ela também coloca um resumo das informações no final.
Outra opção muito útil é --pretty.
Esta opção altera a saída do log para formatos diferentes do padrão.
Existem alguns valores de opções predefinidos disponíveis para você usar.
O valor oneline para esta opção imprime cada commit em uma única linha, o que é útil se você estiver observando muitos commits.
Além disso, os valores short, full e fuller mostram a saída aproximadamente no mesmo formato, mas com menos ou mais informações, respectivamente:
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit
O valor de opção mais interessante é format, que permite que você especifique seu próprio formato de saída de log.
Isso é especialmente útil quando você está gerando saída para análise (parsing) por máquina — como você especifica o formato explicitamente, sabe que ele não será alterado com as atualizações do Git:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit
Especificadores úteis para git log --pretty=format lista alguns dos especificadores mais úteis que o format aceita.
| Especificador | Descrição da Saída |
|---|---|
|
Hash do commit |
|
Hash do commit abreviado |
|
Hash da árvore (tree) |
|
Hash da árvore abreviado |
|
Hashes pais (parent hashes) |
|
Hashes pais abreviados |
|
Nome do autor |
|
E-mail do autor |
|
Data do autor (o formato respeita a opção |
|
Data do autor, relativa |
|
Nome do committer |
|
E-mail do committer |
|
Data do committer |
|
Data do committer, relativa |
|
Assunto |
Você deve estar se perguntando qual é a diferença entre autor (author) e committer. O autor é a pessoa que escreveu o trabalho originalmente, ao passo que o committer é a pessoa que aplicou o trabalho por último. Então, se você enviar um patch para um projeto e um dos membros principais (core members) aplicar o patch, ambos receberão o crédito — você como autor e o membro principal como o committer. Abordaremos essa distinção um pouco mais em Git Distribuído.
Os valores de opção oneline e format são particularmente úteis com outra opção log chamada --graph.
Esta opção adiciona um pequeno gráfico ASCII bacana mostrando o seu histórico de branches e merges:
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
Este tipo de saída se tornará mais interessante conforme passarmos por branches e merges no próximo capítulo.
Essas são apenas algumas opções simples de formatação de saída para o git log — há muitas outras.
Opções comuns para git log lista as opções que cobrimos até agora, bem como algumas outras opções comuns de formatação que podem ser úteis, junto com a forma como elas alteram a saída do comando log.
| Opção | Descrição |
|---|---|
|
Mostra o patch introduzido com cada commit. |
|
Mostra estatísticas de arquivos modificados em cada commit. |
|
Exibe apenas a linha changed/insertions/deletions do comando |
|
Mostra a lista de arquivos modificados após as informações do commit. |
|
Mostra a lista de arquivos afetados com informações de added/modified/deleted também. |
|
Mostra apenas os primeiros caracteres do checksum SHA-1 em vez de todos os 40. |
|
Exibe a data em um formato relativo (por exemplo, “2 weeks ago”) em vez de usar o formato de data completo. |
|
Exibe um gráfico ASCII da história de branches e merges ao lado da saída de log. |
|
Mostra commits em um formato alternativo. Os valores de opções incluem |
|
Uma forma abreviada de |
Limitando a Saída do Log
Além das opções de formatação de saída, o git log aceita várias opções úteis de limitação; ou seja, opções que permitem exibir apenas um subconjunto de commits.
Você já viu uma dessas opções — a opção -2, que exibe apenas os dois últimos commits.
De fato, você pode usar -<n>, onde n é qualquer número inteiro para mostrar os últimos n commits.
Na realidade, é improvável que você o use com frequência, porque, por padrão, o Git envia (pipes) toda a saída por meio de um pager para que você veja apenas uma página de saída de log por vez.
No entanto, as opções de limite de tempo, como --since e --until, são muito úteis.
Por exemplo, este comando obtém a lista de commits feitos nas últimas duas semanas:
$ git log --since=2.weeks
Este comando funciona com vários formatos — você pode especificar uma data específica como "2008-01-15", ou uma data relativa como "2 years 1 day 3 minutes ago".
Você também pode filtrar a lista para os commits que correspondam a alguns critérios de pesquisa.
A opção --author permite filtrar um autor específico, e a opção --grep permite pesquisar palavras-chave nas mensagens de commit.
|
Note
|
Você pode especificar mais de uma instância dos critérios de pesquisa |
Outro filtro realmente útil é a opção -S (coloquialmente chamada de opção “pickaxe” do Git), que recebe uma string e mostra apenas os commits que alteraram o número de ocorrências dessa string.
Por exemplo, se você quisesse encontrar o último commit que adicionou ou removeu uma referência a uma função específica, você poderia chamar:
$ git log -S function_name
A última opção realmente útil para passar para git log como filtro é um caminho.
Se você especificar um diretório ou nome de arquivo, poderá limitar a saída do log aos commits que introduziram uma alteração nesses arquivos.
Essa é sempre a última opção e geralmente é precedida por dois hifens (--) para separar os caminhos das opções:
$ git log -- path/to/file
Em Opções para limitar a saída de git log, listaremos estas e algumas outras opções comuns para sua referência.
| Opção | Descrição |
|---|---|
|
Mostra apenas os últimos n commits. |
|
Limita os commits aos feitos após a data especificada. |
|
Limita os commits aos feitos antes da data especificada. |
|
Mostra apenas os commits em que a entrada do autor corresponda à string especificada. |
|
Mostra apenas os commits em que a entrada do committer corresponda à string especificada. |
|
Mostra apenas os commits com uma mensagem de commit contendo a string. |
|
Mostra apenas os commits adicionando ou removendo código correspondente à string. |
Por exemplo, se você quiser ver quais commits que modificaram os arquivos de teste no histórico de código-fonte do Git foram commitados por Junio Hamano no mês de outubro de 2008 e não são commits de mesclagem (merge commits), você pode executar algo assim:
$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
Dos quase 40.000 commits no histórico do código-fonte do Git, esse comando mostra os 6 que correspondem a esses critérios.
|
Tip
|
Prevenindo a exibição de commits de mesclagem (merge commits)
Dependendo do fluxo de trabalho usado no seu repositório, é possível que uma porcentagem considerável dos commits no seu histórico de log sejam apenas commits de mesclagem, que normalmente não são muito informativos.
Para evitar que a exibição de commits de mesclagem sobrecarregue (cluttering up) seu histórico de log, basta adicionar a opção |