-
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
7.2 Ferramentas do Git - Área de Stage Interativa
Área de Stage Interativa
Nesta seção, você verá alguns comandos interativos do Git que podem ajudá-lo a criar seus commits para incluir apenas certas combinações e partes de arquivos. Essas ferramentas são úteis se você modificar vários arquivos extensivamente, então decide que quer que essas alterações sejam divididas em vários commits focados em vez de um único commit grande e confuso. Dessa forma, você pode certificar-se de que seus commits são conjuntos de alterações separados logicamente e podem ser revisados facilmente pelos desenvolvedores que trabalham com você.
Se você executar git add com a opção -i ou --interactive, o Git entra em um modo shell interativo, exibindo algo como isto:
$ git add -i
staged unstaged path
1: unchanged +0/-1 TODO
2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now>
Você pode ver que este comando mostra uma visão da sua área de stage muito diferente da que você provavelmente está acostumado — basicamente, a mesma informação que você obtém com git status, mas um pouco mais sucinta e informativa.
Ela lista as alterações que estão na área de stage à esquerda e as não preparadas (unstaged) à direita.
Depois disso vem uma seção “Commands” (Comandos), que permite fazer uma série de coisas como preparar e retirar arquivos da área de stage, preparar partes de arquivos, adicionar arquivos não rastreados e exibir diffs do que foi preparado (staged).
Adicionando e Removendo Arquivos do Stage
Se você digitar u ou 2 (para update) no prompt What now>, você será questionado sobre quais arquivos deseja preparar (stage):
What now> u
staged unstaged path
1: unchanged +0/-1 TODO
2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
Update>>
Para preparar (stage) os arquivos TODO e index.html, você pode digitar os números:
Update>> 1,2
staged unstaged path
* 1: unchanged +0/-1 TODO
* 2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
Update>>
O * próximo a cada arquivo significa que o arquivo foi selecionado para ser preparado.
Se você pressionar Enter após não digitar nada no prompt Update>>, o Git pegará qualquer coisa selecionada e a preparará para você:
Update>>
updated 2 paths
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> s
staged unstaged path
1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Agora você pode ver que os arquivos TODO e index.html estão preparados (staged) e o arquivo simplegit.rb ainda não está (unstaged).
Se você deseja remover (unstage) o arquivo TODO neste momento, use a opção r ou 3 (para revert):
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> r
staged unstaged path
1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Revert>> 1
staged unstaged path
* 1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path
Olhando para o seu status do Git novamente, você pode ver que você retirou o arquivo TODO do stage:
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> s
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Para ver o diff do que você preparou, você pode usar o comando d ou 6 (para diff).
Ele mostra uma lista dos seus arquivos preparados, e você pode selecionar aqueles para os quais gostaria de ver o diff.
Isso é muito parecido com especificar git diff --cached na linha de comando:
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> d
staged unstaged path
1: +1/-1 nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder
<p id="out">...</p>
-<div id="footer">contact : support@github.com</div>
+<div id="footer">contact : email.support@github.com</div>
<script type="text/javascript">
Com esses comandos básicos, você pode usar o modo interativo de adição para lidar com a sua área de stage com um pouco mais de facilidade.
Patches na Área de Stage
Também é possível para o Git preparar (stage) certas partes de arquivos e não o resto.
Por exemplo, se você fizer duas alterações no seu arquivo simplegit.rb e quiser preparar uma delas e não a outra, fazer isso é muito fácil no Git.
A partir do mesmo prompt interativo explicado na seção anterior, digite p ou 5 (para patch).
O Git perguntará quais arquivos você gostaria de preparar parcialmente; então, para cada seção dos arquivos selecionados, ele exibirá pedaços (hunks) do diff do arquivo e perguntará se você gostaria de prepará-los, um por um:
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
end
def log(treeish = 'master')
- command("git log -n 25 #{treeish}")
+ command("git log -n 30 #{treeish}")
end
def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?
Você tem muitas opções neste ponto.
Digitar ? mostra uma lista do que você pode fazer:
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
Geralmente, você digitará y ou n se quiser preparar (stage) cada pedaço (hunk), mas preparar todos eles em certos arquivos ou pular a decisão de um hunk para mais tarde também pode ser útil.
Se você preparar (stage) uma parte do arquivo e deixar outra parte não preparada (unstaged), a saída do seu status ficará assim:
What now> 1
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: +1/-1 +4/-0 lib/simplegit.rb
O status do arquivo simplegit.rb é interessante.
Ele mostra que algumas linhas estão na área de stage e algumas não estão.
Você preparou parcialmente este arquivo.
Neste ponto, você pode sair do script de adição interativa e executar git commit para comitar os arquivos parcialmente preparados.
Você também não precisa estar no modo de adição interativa para fazer o stage parcial do arquivo — você pode iniciar o mesmo script usando git add -p ou git add --patch na linha de comando.
Além disso, você pode usar o modo patch para resetar parcialmente arquivos com o comando git reset --patch, para fazer checkout de partes de arquivos com o comando git checkout --patch e para fazer stash de partes de arquivos com o comando git stash save --patch.
Entraremos em mais detalhes sobre cada um deles quando chegarmos a usos mais avançados desses comandos.