-
1. Começando
- 1.1 Sobre Controle de Versão
- 1.2 Uma Breve História do Git
- 1.3 O Básico do Git
- 1.4 A Linha de Comando
- 1.5 Instalando o Git
- 1.6 Configuração Inicial do Git
- 1.7 Pedindo Ajuda
- 1.8 Sumário
-
2. Fundamentos de Git
-
3. Branches no Git
-
4. Git on the Server
- 4.1 The Protocols
- 4.2 Getting Git on a Server
- 4.3 Generating Your SSH Public Key
- 4.4 Setting Up the Server
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Third Party Hosted Options
- 4.10 Summary
-
5. Distributed Git
-
6. GitHub
- 6.1 Configurando uma conta
- 6.2 Contribuindo em um projeto
- 6.3 Maintaining a Project
- 6.4 Managing an organization
- 6.5 Scripting GitHub
- 6.6 Summary
-
7. Git Tools
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Summary
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
10. Funcionamento Interno do Git
- 10.1 Encanamento e Porcelana
- 10.2 Objetos do Git
- 10.3 Referências do Git
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Variáveis de ambiente
- 10.9 Sumário
-
A1. Appendix A: Git em Outros Ambientes
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Resumo
-
A2. Appendix B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
2.3 Fundamentos de Git - Vendo o histórico de Commits
Vendo o histórico de Commits
Depois de você ter criado vários commits ou se você clonou um repositório com um histórico de commits pré-existente, você vai provavelmente querer olhar para trás e ver o que aconteceu.
A ferramenta mais básica e poderosa para fazer isso é o comando git log
.
Esses exemplos usam um projeto muito simples chamando “simplegit”. Para conseguir o projeto, execute
$ git clone https://github.com/schacon/simplegit-progit
Quando você executa git log
neste projeto, você deve receber um retorno que se parece com algo assim:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
Por padrão, sem argumentos, git log
lista os commits feitos neste repositório em ordem cronológica inversa; isto é, o commit mais recente aparece primeiro.
Como você pode ver, esse comando lista cada commit com o seu checksum SHA-1, o nome e email do autor, data de inserção, e a mensagem do commit.
Está disponível um enorme número e variedade de opções para o comando git log
a fim de lhe mostrar exatamente aquilo pelo que está procurando.
Aqui, vamos mostrar a você algumas das mais populares.
Uma das opções que mais ajuda é -p
, que mostra as diferenças introduzidas em cada commit.
Você pode também usar -2
, que lista no retorno apenas os dois últimos itens:
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the 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
removed 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
\ No newline at end of file
Essa opção mostrar a mesma informação mas com um diff diretamente após cada item.
Isso é de muita ajuda para revisão de código ou para rapidamente procurar o que aconteceu durante uma série de commits que uma colaborador tenha adicionado.
Você pode também usar uma série de opções resumidas com o git log
.
Por exemplo, se você quer ver algumas estatísticas abreviadas para cada commit, você 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
changed the 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
removed 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
first commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
Como você pode ver, a opção --stat
apresenta abaixo de cada commit uma lista dos arquivos modificados, quantos arquivos foram modificados, e quantas linhas nestes arquivos foram adicionadas e removidas.
Por último ela também colocar um resumo das informações.
Uma outra opção realmente muito util é --pretty
.
Essa opção modifica os registros retornados para formar outro formato diferente do padrão.
Algumas opções pré-definidas estão disponíveis para você usar.
A opção oneline
mostra cada commit em uma única linha, esta é de muita ajuda se você está olhando para muitos commits.
Em adição, as opções short
, full
, e fuller
apresentam o retorno quase no mesmo formato porem com menos ou mais informações, respectivamente:
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
A opção mais interessante é format
, a qual permite a você especificar seu próprio formato de registros de retorno.
Isso é especialmente útil quando você esta gerando um retorno para uma máquina analisar – pois você especifica o formato explicitamente, você sabe que isso não irá mudar com as atualizações do Git:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
Useful options for git log --pretty=format
lista algumas das opções mais uteis que format
gera.
Opção | Descrição da saída |
---|---|
|
Hash do commit |
|
Hash do commit abreviado |
|
Hash da árvore |
|
Hash da árvore abreviado |
|
Hashes dos pais |
|
Hashes dos pais abreviado |
|
Nome do Autor |
|
Email do Autor |
|
Data do Autor (o formato segue a opção --date=option) |
|
Data do Autor, relativa |
|
Nome do Committer |
|
Email do Committer |
|
Data do Committer |
|
Data do Committer, relativa |
|
Comentário |
Você talvez esteja imaginando qual a diferença entre author e committer. O autor é a pessoa que escreveu originalmente o trabalho, ao passo que a pessoa que submeteu o trabalho é o committer. Então, se você criar uma correção para um projeto e um dos membros principais submete a correção, ambos receberão crédito – você como autor, e o membro principal como commiter. Nós vamos abordar esta distinção um pouco mais em [ch05-distributed-git].
As opções oneline
e format
são particularmente úteis juntamente com uma outra opção de log
chamada --graph
.
Esta opção adiciona um pequeno gráfico ASCII mostrando seu histórico de branch e merge:
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a 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
Esse tipo de retorno se tornará mais interessante conforme formos criando branches e merges no próximo capitulo.
Essas são apenas algumas opções simples de formatações de retorno para git log
– existem muitas mais.
Common options to git log
lista as opções que nós já abordamos, assim como algumas outras opções de formatação mais comuns que talvez sejam muito úteis, juntamente com o como ela mudam o retorno do comando log.
Opções | Descrição |
---|---|
|
Mostra o patch introduzido com cada commit. |
|
Mostra estatísticas de arquivos modificados em cada commit. |
|
Exibe apenas a linha informando a alteração, inserção e exclusão do comando --stat. |
|
Mostra a lista de arquivos modificados após as informações de commit. |
|
Mostra também a lista de arquivos que sofreram modificação com informações adicionadas / modificadas / excluídas. |
|
Mostra apenas os primeiros caracteres da soma de verificação SHA-1 em vez de todos os 40. |
|
Exibe a data em um formato relativo (por exemplo, ‘` 2 semanas atrás '’) em vez de usar o formato de data completo. |
|
Exibe um gráfico ASCII do histórico de branches e merges ao lado da saída do log. |
|
Mostra os commits em um formato alternativo. As opções incluem oneline, short, full, fuller e format (onde você especifica seu próprio formato). |
Limitando o retorno do comando Log
Em adição ás opções de formatação do retorno, git log
leva um número útil de opções de limitação – que são, opções que lhe permitem mostrar apenas um subconjunto de commits.
Você já viu essa opção antes – a opção -2
, a qual mostra apenas os dois últimos commits.
De fato, você pode usar -<n>
, onde n
é qualquer número inteiro para mostra os ultimos n
commits.
Na verdade, você não gostará de usar isso frequentemente, pois o Git por padrão enquadra todo o retorno através de uma página então você vê apenas uma página de registros por vez.
Entretanto, as opções de lina do tempo tais como --since
e --until
são muito uteis.
Por exemplo, esse comando retorna a lista de commits feitos nas últimas duas semanas:
$ git log --since=2.weeks
Esse comando funciona com um grande número de formatos – você pode determinar uma data específica como "2008-01-15"
, ou uma data relativa tal como "2 anos 1 dia 3 minutos atrás"
.
Você pode também filtrar a lista de commits que combinam com algum critério de busca.
A opção --author
permite você filtrar por um autor especifico, e a opção --grep
permite você procurar por palavras chaves na mensagem do commit.
(Note que se você quer especificar ambas as opções autor e grep, você tem que adicionar --all-match
ou o comando irá combinar com qualquer uma delas.)
Uma outra opção de filtro que realmente ajuda muito é -S
A qual pega um conjunto de caracteres e mostra apenas os commits que introduzem uma mudança no código onde esse conjunto é adicionado ou removido.
Por exemplo, se você quer encontrar o último commit que adicionou ou removeu uma referência a uma função especifica, você poderia chamar:
$ git log -Sfunction_name
A última opção realmente útil para passar ao git log
como filtro é o caminho.
Se você especificar um diretório ou nome de arquivo, você pode limitar os registros retornados referentes aos commits que introduziram uma mudança a estes arquivos.
Issa é sempre a última opção e é geralmente precedida por dois traços (--
) para separa os caminhos das opções dos comandos.
Em Options to limit the output of git log
nós vamos listar estes e algumas outras opções comuns para sua referência.
Opção | Descrição |
---|---|
|
Exibe somente os últimos n commits |
|
Limita os commits para aqueles feitos após a data especificada. |
|
Limita os commits aos feitos antes da data especificada. |
|
Mostra apenas os commits nos quais a entrada do autor corresponde à string especificada. |
|
Mostra apenas os commits nos quais a entrada do committer corresponde à string especificada. |
|
Mostra apenas os commits com uma mensagem de commit contendo a string |
|
mostrar apenas commits adicionando ou removendo o código que corresponde à string |
Por exemplo, se você quer ver quais commits estão modificando arquivos de testes no histórico do código fonte do Git que sofreram commit por Junio Hamano no mês de Outubro de 2008 e não são commits de merge, você pode executar algo semelhante a isso:
$ git log --pretty="%h - %s" --author=gitster --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 combinam com esses critérios.