-
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.4 Fundamentos do Git - Desfazendo Coisas
Desfazendo Coisas
Em qualquer estágio, você pode querer desfazer algo. Aqui, revisaremos algumas ferramentas básicas para desfazer alterações que você fez. Tenha cuidado, pois você nem sempre pode desfazer alguns desses desfazimentos. Esta é uma das poucas áreas no Git onde você pode perder algum trabalho se fizer de forma incorreta.
Um dos desfazimentos comuns ocorre quando você faz o commit muito cedo e possivelmente se esquece de adicionar alguns arquivos, ou você bagunça sua mensagem de commit.
Se você quiser refazer esse commit, faça as alterações adicionais que esqueceu, prepare-as e faça o commit novamente usando a opção --amend:
$ git commit --amend
Este comando pega sua área de preparação e a utiliza para o commit. Se você não fez nenhuma alteração desde o seu último commit (por exemplo, você executa este comando imediatamente após o commit anterior), então o seu snapshot ficará exatamente o mesmo e tudo o que você alterará será a sua mensagem de commit.
O mesmo editor de mensagem de commit é iniciado, mas já contém a mensagem do seu commit anterior. Você pode editar a mensagem da mesma forma de sempre, mas ela substitui (overwrites) seu commit anterior.
Como exemplo, se você fizer o commit e, em seguida, perceber que se esqueceu de preparar as alterações em um arquivo que queria adicionar a este commit, você pode fazer algo assim:
$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend
Você acaba com um único commit — o segundo commit substitui os resultados do primeiro.
|
Note
|
É importante entender que quando você está alterando (amending) seu último commit, você não está tanto corrigindo-o, mas substituindo-o inteiramente por um novo e melhorado commit que empurra o antigo commit para fora do caminho e coloca o novo commit em seu lugar. Efetivamente, é como se o commit anterior nunca tivesse acontecido, e ele não aparecerá no histórico do seu repositório. O valor óbvio de alterar (amending) commits é fazer pequenas melhorias em seu último commit, sem sobrecarregar o histórico do seu repositório com mensagens de commit na forma, “Ops, esqueci de adicionar um arquivo” ou “Droga, corrigindo erro de digitação no último commit”. |
|
Note
|
Altere apenas commits que ainda são locais e não foram enviados (pushed) para algum lugar. Alterar commits enviados anteriormente e forçar o push do branch causará problemas para seus colaboradores. Para saber mais sobre o que acontece quando você faz isso e como se recuperar se estiver do lado do destinatário, leia Os Perigos do Rebase (Perils of Rebasing). |
Retirando a Preparação de um Arquivo Preparado (Unstaging)
As próximas duas seções demonstram como trabalhar com a sua área de preparação e com as alterações do diretório de trabalho.
A parte boa é que o comando que você usa para determinar o estado dessas duas áreas também o lembra de como desfazer alterações nelas.
Por exemplo, digamos que você alterou dois arquivos e quer fazer o commit deles como duas alterações separadas, mas você acidentalmente digitou git add * e preparou ambos.
Como você pode retirar a preparação de (unstage) um dos dois?
O comando git status o lembra:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
Logo abaixo do texto “Changes to be committed”, ele diz para usar git reset HEAD <file>… para retirar a preparação (unstage).
Então, vamos usar esse conselho para retirar a preparação do arquivo CONTRIBUTING.md:
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
O comando é um pouco estranho, mas funciona.
O arquivo CONTRIBUTING.md está modificado, mas mais uma vez não preparado (unstaged).
|
Note
|
É verdade que |
Por enquanto, essa invocação mágica é tudo o que você precisa saber sobre o comando git reset.
Entraremos em muito mais detalhes sobre o que o reset faz e como dominá-lo para fazer coisas realmente interessantes em Reset Desmistificado.
Desfazendo a Modificação de um Arquivo Modificado
E se você perceber que não deseja manter as alterações feitas no arquivo CONTRIBUTING.md?
Como você pode desfazer as modificações facilmente — revertê-lo para a aparência que tinha da última vez em que fez o commit (ou clonou inicialmente, ou como quer que tenha chegado ao seu diretório de trabalho)?
Felizmente, o git status também diz como fazer isso.
Na saída do último exemplo, a área não preparada se parece com isto:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Ele diz explicitamente como descartar as alterações feitas. Vamos fazer o que ele diz:
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Você pode ver que as alterações foram revertidas.
|
Important
|
É importante entender que |
Se você gostaria de manter as alterações feitas nesse arquivo, mas ainda precisa tirá-lo do caminho por enquanto, abordaremos as opções de stashing e branching no Ramificação (Branching) no Git; essas são geralmente maneiras melhores de prosseguir.
Lembre-se, qualquer coisa que seja commitada no Git quase sempre pode ser recuperada.
Até mesmo commits que estavam em branches que foram excluídos ou commits que foram sobrescritos com um commit --amend podem ser recuperados (consulte Recuperação de Dados para recuperação de dados).
No entanto, qualquer coisa que você perca e que nunca tenha sido commitada provavelmente nunca mais será vista.
Desfazendo coisas com git restore
O Git versão 2.23.0 introduziu um novo comando: git restore.
É basicamente uma alternativa ao git reset que acabamos de abordar.
A partir do Git versão 2.23.0, o Git usará git restore em vez de git reset para muitas operações de desfazer.
Vamos refazer nossos passos e desfazer as coisas com git restore em vez de git reset.
Retirando a Preparação de um Arquivo Preparado com git restore
As próximas duas seções demonstram como trabalhar com a sua área de preparação e as alterações do diretório de trabalho com git restore.
A parte boa é que o comando que você usa para determinar o estado dessas duas áreas também o lembra de como desfazer alterações nelas.
Por exemplo, digamos que você alterou dois arquivos e quer fazer o commit deles como duas alterações separadas, mas você acidentalmente digitou git add * e preparou ambos.
Como você pode retirar a preparação de (unstage) um dos dois?
O comando git status o lembra:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: CONTRIBUTING.md
renamed: README.md -> README
Logo abaixo do texto “Changes to be committed”, ele diz para usar git restore --staged <file>… para retirar a preparação (unstage).
Então, vamos usar esse conselho para retirar a preparação do arquivo CONTRIBUTING.md:
$ git restore --staged CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
O arquivo CONTRIBUTING.md está modificado, mas mais uma vez não preparado (unstaged).
Desfazendo a Modificação de um Arquivo Modificado com git restore
E se você perceber que não deseja manter as alterações feitas no arquivo CONTRIBUTING.md?
Como você pode desfazer as modificações facilmente — revertê-lo para a aparência que tinha da última vez em que fez o commit (ou clonou inicialmente, ou como quer que tenha chegado ao seu diretório de trabalho)?
Felizmente, o git status também diz como fazer isso.
Na saída do último exemplo, a área não preparada se parece com isto:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Ele diz explicitamente como descartar as alterações feitas. Vamos fazer o que ele diz:
$ git restore CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
|
Important
|
É importante entender que |