-
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.2 Fundamentos do Git - Gravando Alterações no Repositório
Gravando Alterações no Repositório
Neste ponto, você deve ter um repositório Git bona fide na sua máquina local e um checkout ou cópia de trabalho (working copy) de todos os seus arquivos à sua frente. Normalmente, você vai querer começar a fazer alterações e fazer o commit de snapshots dessas alterações no seu repositório cada vez que o projeto atingir um estado que você deseja gravar.
Lembre-se de que cada arquivo no seu diretório de trabalho pode estar em um de dois estados: rastreado (tracked) ou não rastreado (untracked). Arquivos rastreados são arquivos que estavam no último snapshot, bem como quaisquer arquivos recém-preparados; eles podem estar não modificados, modificados ou preparados (staged). Em resumo, arquivos rastreados são arquivos que o Git conhece.
Arquivos não rastreados são tudo o mais — quaisquer arquivos no seu diretório de trabalho que não estavam no seu último snapshot e não estão na sua área de preparação. Quando você clona um repositório pela primeira vez, todos os seus arquivos estarão rastreados e não modificados, porque o Git acabou de fazer o checkout deles e você não editou nada.
À medida que você edita os arquivos, o Git os vê como modificados, porque você os alterou desde o último commit. Conforme você trabalha, você prepara seletivamente esses arquivos modificados e, em seguida, faz o commit de todas essas alterações preparadas, e o ciclo se repete.
Verificando o status dos seus arquivos
A principal ferramenta que você usa para determinar quais arquivos estão em qual estado é o comando git status.
Se você executar este comando logo após um clone, deverá ver algo assim:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Isso significa que você tem um diretório de trabalho limpo; em outras palavras, nenhum dos seus arquivos rastreados foi modificado.
O Git também não vê nenhum arquivo não rastreado, ou eles estariam listados aqui.
Por fim, o comando informa em qual branch você está e informa que não divergiu do mesmo branch no servidor.
Por enquanto, esse branch é sempre master, que é o padrão; você não vai se preocupar com isso aqui.
Ramificação (Branching) no Git abordará branches e referências em detalhes.
|
Note
|
O GitHub mudou o nome padrão do branch de No entanto, o próprio Git ainda usa |
Digamos que você adicione um novo arquivo ao seu projeto, um arquivo README simples.
Se o arquivo não existia antes e você executar git status, verá seu arquivo não rastreado assim:
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
Você pode ver que seu novo arquivo README não é rastreado, porque está sob o cabeçalho “Untracked files” na saída do status.
Não rastreado basicamente significa que o Git vê um arquivo que você não tinha no snapshot anterior (commit) e que ainda não foi preparado; o Git não começará a incluí-lo em seus snapshots de commit até que você diga explicitamente a ele para fazer isso.
Ele faz isso para que você não comece acidentalmente a incluir arquivos binários gerados ou outros arquivos que você não pretendia incluir.
Você quer começar a incluir o README, então vamos começar a rastrear o arquivo.
Rastreando Novos Arquivos
Para começar a rastrear um novo arquivo, você usa o comando git add.
Para começar a rastrear o arquivo README, você pode executar isto:
$ git add README
Se você executar seu comando status novamente, poderá ver que seu arquivo README agora está rastreado e preparado para ser commitado:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
Você pode dizer que ele está preparado porque está sob o cabeçalho “Changes to be committed”.
Se você fizer o commit neste ponto, a versão do arquivo no momento em que você executou o git add é a que estará no snapshot histórico subsequente.
Você deve se lembrar que, quando executou o git init anteriormente, executou o git add <arquivos> em seguida — isso foi para começar a rastrear arquivos no seu diretório.
O comando git add recebe um nome de caminho para um arquivo ou diretório; se for um diretório, o comando adiciona todos os arquivos desse diretório recursivamente.
Preparando Arquivos Modificados
Vamos alterar um arquivo que já estava rastreado.
Se você alterar um arquivo previamente rastreado chamado CONTRIBUTING.md e depois executar seu comando git status novamente, obterá algo parecido com isto:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: 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 arquivo CONTRIBUTING.md aparece em uma seção chamada “Changes not staged for commit” — o que significa que um arquivo que é rastreado foi modificado no diretório de trabalho, mas ainda não foi preparado.
Para prepará-lo, você executa o comando git add.
git add é um comando polivalente — você o usa para começar a rastrear novos arquivos, preparar arquivos e fazer outras coisas como marcar arquivos com conflito de mesclagem (merge-conflicted files) como resolvidos.
Pode ser útil pensar nele mais como “adicione precisamente este conteúdo ao próximo commit” em vez de “adicione este arquivo ao projeto”.
Vamos executar git add agora para preparar o arquivo CONTRIBUTING.md e depois executar git status novamente:
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Ambos os arquivos estão preparados e irão para o seu próximo commit.
Neste ponto, suponha que você se lembre de uma pequena alteração que deseja fazer no CONTRIBUTING.md antes de fazer o commit dele.
Você o abre novamente e faz essa alteração, e está pronto para fazer o commit.
No entanto, vamos executar git status mais uma vez:
$ vim CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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
Que diabos?
Agora o CONTRIBUTING.md está listado como preparado e não preparado.
Como isso é possível?
Acontece que o Git prepara um arquivo exatamente como ele é quando você executa o comando git add.
Se você fizer o commit agora, a versão de CONTRIBUTING.md como era quando você executou o comando git add pela última vez é como ela entrará no commit, não a versão do arquivo como aparece no seu diretório de trabalho quando você executa git commit.
Se você modificar um arquivo depois de executar git add, precisará executar git add novamente para preparar a versão mais recente do arquivo:
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Status Curto
Embora a saída de git status seja bem abrangente, ela também é bastante prolixa.
O Git também tem uma flag de status curto (short status) para que você possa ver suas alterações de uma maneira mais compacta.
Se você executar git status -s ou git status --short, obterá uma saída muito mais simplificada do comando:
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
Arquivos novos que não são rastreados têm um ?? ao lado deles, arquivos novos que foram adicionados à área de preparação têm um A, arquivos modificados têm um M e assim por diante.
Existem duas colunas na saída — a coluna da esquerda indica o status da área de preparação e a coluna da direita indica o status da árvore de trabalho (working tree).
Portanto, por exemplo nessa saída, o arquivo README foi modificado no diretório de trabalho, mas ainda não foi preparado, enquanto o arquivo lib/simplegit.rb foi modificado e preparado.
O Rakefile foi modificado, preparado e modificado novamente, portanto, há alterações nele que estão preparadas e não preparadas.
Ignorando Arquivos
Geralmente, você terá uma classe de arquivos que não deseja que o Git adicione automaticamente ou até mesmo mostre a você como não rastreados.
Estes geralmente são arquivos gerados automaticamente, como arquivos de log ou arquivos produzidos pelo seu sistema de compilação (build system).
Nesses casos, você pode criar um arquivo listando padrões que correspondam a eles, chamado .gitignore.
Aqui está um exemplo de arquivo .gitignore:
$ cat .gitignore
*.[oa]
*~
A primeira linha diz ao Git para ignorar quaisquer arquivos que terminem em “.o” ou “.a” — arquivos de objeto e de arquivamento (archive) que podem ser o produto da compilação do seu código.
A segunda linha diz ao Git para ignorar todos os arquivos cujos nomes terminam com um til (~), o que é usado por muitos editores de texto como o Emacs para marcar arquivos temporários.
Você também pode incluir um diretório de log, tmp ou pid; documentação gerada automaticamente; e assim por diante.
Configurar um arquivo .gitignore para o seu novo repositório antes de começar é geralmente uma boa ideia, para que você não faça o commit acidentalmente de arquivos que você realmente não deseja em seu repositório Git.
As regras para os padrões que você pode colocar no arquivo .gitignore são as seguintes:
-
Linhas em branco ou linhas começando com
#são ignoradas. -
Os padrões de glob (glob patterns) padrão funcionam e serão aplicados recursivamente em toda a árvore de trabalho.
-
Você pode iniciar os padrões com uma barra normal (
/) para evitar a recursividade. -
Você pode terminar os padrões com uma barra normal (
/) para especificar um diretório. -
Você pode negar um padrão iniciando-o com um ponto de exclamação (
!).
Os padrões de glob são como expressões regulares simplificadas que os shells usam.
Um asterisco (*) corresponde a zero ou mais caracteres; [abc] corresponde a qualquer caractere dentro dos colchetes (neste caso, a, b ou c); um ponto de interrogação (?) corresponde a um único caractere; e os caracteres dentro de colchetes separados por um hífen ([0-9]) correspondem a qualquer caractere entre eles (neste caso, de 0 a 9).
Você também pode usar dois asteriscos para corresponder a diretórios aninhados; a/**/z corresponderia a a/z, a/b/z, a/b/c/z e assim por diante.
Aqui está outro exemplo de arquivo .gitignore:
# ignore all .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in any directory named build
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory and any of its subdirectories
doc/**/*.pdf
|
Tip
|
O GitHub mantém uma lista bastante abrangente de bons exemplos de arquivos |
|
Note
|
No caso simples, um repositório pode ter um único arquivo Está além do escopo deste livro entrar em detalhes de vários arquivos |
Visualizando suas Alterações Preparadas e Não Preparadas
Se o comando git status for muito vago para você — você quer saber exatamente o que você alterou, não apenas quais arquivos foram alterados — você pode usar o comando git diff.
Abordaremos o git diff com mais detalhes posteriormente, mas você provavelmente o usará com mais frequência para responder a estas duas perguntas: O que você alterou, mas ainda não preparou?
E o que você preparou que está prestes a fazer o commit?
Embora git status responda a essas perguntas de maneira muito geral, listando os nomes dos arquivos, git diff mostra as linhas exatas adicionadas e removidas — o patch, por assim dizer.
Digamos que você edite e prepare o arquivo README novamente e, em seguida, edite o arquivo CONTRIBUTING.md sem prepará-lo.
Se você executar seu comando git status, verá mais uma vez algo assim:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: 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
Para ver o que você alterou, mas ainda não preparou, digite git diff sem outros argumentos:
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
Esse comando compara o que está no seu diretório de trabalho com o que está na sua área de preparação. O resultado informa as alterações que você fez e que ainda não preparou.
Se você quiser ver o que você preparou e que irá para o seu próximo commit, pode usar git diff --staged.
Este comando compara suas alterações preparadas com o seu último commit:
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project
É importante notar que git diff por si só não mostra todas as alterações feitas desde o seu último commit — apenas as alterações que ainda não foram preparadas.
Se você tiver preparado todas as suas alterações, o git diff não fornecerá nenhuma saída.
Como outro exemplo, se você preparar o arquivo CONTRIBUTING.md e depois editá-lo, poderá usar git diff para ver as alterações no arquivo que estão preparadas e as alterações que não estão preparadas.
Se o nosso ambiente for assim:
$ git add CONTRIBUTING.md
$ echo '# test line' >> CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: CONTRIBUTING.md
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
Agora você pode usar git diff para ver o que ainda não foi preparado:
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 643e24f..87f08c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -119,3 +119,4 @@ at the
## Starter Projects
See our [projects list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md).
+# test line
e git diff --cached para ver o que você preparou até agora (--staged e --cached são sinônimos):
$ git diff --cached
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
|
Note
|
Git Diff em uma Ferramenta Externa
Continuaremos a usar o comando |
Fazendo o Commit de suas Alterações
Agora que sua área de preparação está configurada do jeito que você deseja, você pode fazer o commit de suas alterações.
Lembre-se de que qualquer coisa que ainda não esteja preparada — quaisquer arquivos que você criou ou modificou e nos quais não executou git add desde que os editou — não entrará neste commit.
Eles permanecerão como arquivos modificados no seu disco.
Neste caso, digamos que da última vez que você executou git status, viu que tudo estava preparado, então você está pronto para fazer o commit das suas alterações.
A maneira mais simples de fazer o commit é digitar git commit:
$ git commit
Isso inicia o seu editor de escolha.
|
Note
|
Isso é definido pela variável de ambiente |
O editor exibe o seguinte texto (este exemplo é uma tela do Vim):
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
Você pode ver que a mensagem de commit padrão contém a saída mais recente do comando git status comentada e uma linha vazia no topo.
Você pode remover esses comentários e digitar sua mensagem de commit, ou pode deixá-los lá para ajudá-lo a lembrar o que está commitando.
|
Note
|
Para um lembrete ainda mais explícito do que você modificou, você pode passar a opção |
Quando você sai do editor, o Git cria o seu commit com essa mensagem de commit (com os comentários e o diff removidos).
Alternativamente, você pode digitar sua mensagem de commit embutida no comando commit especificando-a após a flag -m, assim:
$ git commit -m "Story 182: fix benchmarks for speed"
[master 463dc4f] Story 182: fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
Agora você criou o seu primeiro commit!
Você pode ver que o commit forneceu a você algumas saídas sobre si mesmo: em qual branch você fez o commit (master), qual checksum SHA-1 o commit tem (463dc4f), quantos arquivos foram alterados e estatísticas sobre as linhas adicionadas e removidas no commit.
Lembre-se de que o commit registra o snapshot que você configurou na sua área de preparação. Qualquer coisa que você não tenha preparado ainda está lá modificada; você pode fazer outro commit para adicioná-la ao seu histórico. Toda vez que você realiza um commit, está registrando um snapshot do seu projeto para o qual você pode reverter ou comparar posteriormente.
Ignorando a Área de Preparação
Embora possa ser incrivelmente útil para criar commits exatamente da forma como você os deseja, a área de preparação às vezes é um pouco mais complexa do que você precisa em seu fluxo de trabalho.
Se você quiser pular a área de preparação, o Git fornece um atalho simples.
Adicionar a opção -a ao comando git commit faz com que o Git prepare automaticamente todos os arquivos que já estão sendo rastreados antes de fazer o commit, permitindo que você ignore a parte do git add:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
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
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'Add new benchmarks'
[master 83e38c7] Add new benchmarks
1 file changed, 5 insertions(+), 0 deletions(-)
Observe como você não precisa executar git add no arquivo CONTRIBUTING.md neste caso antes de fazer o commit.
Isso ocorre porque a flag -a inclui todos os arquivos alterados.
Isso é conveniente, mas tenha cuidado; às vezes, essa flag fará com que você inclua alterações indesejadas.
Removendo Arquivos
Para remover um arquivo do Git, você deve removê-lo dos seus arquivos rastreados (mais precisamente, removê-lo da sua área de preparação) e, em seguida, fazer o commit.
O comando git rm faz isso e também remove o arquivo do seu diretório de trabalho para que você não o veja como um arquivo não rastreado na próxima vez.
Se você simplesmente remover o arquivo do seu diretório de trabalho, ele aparecerá na área “Changes not staged for commit” (ou seja, não preparado) da saída do seu git status:
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
Então, se você executar git rm, ele preparará a remoção do arquivo:
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: PROJECTS.md
Na próxima vez que você fizer commit, o arquivo não existirá mais e não será mais rastreado.
Se você modificou o arquivo ou já o adicionou à área de preparação, deve forçar a remoção com a opção -f.
Esse é um recurso de segurança para evitar a remoção acidental de dados que ainda não foram gravados em um snapshot e que não podem ser recuperados do Git.
Outra coisa útil que você pode querer fazer é manter o arquivo na sua árvore de trabalho, mas removê-lo da sua área de preparação.
Em outras palavras, você pode querer manter o arquivo no seu disco rígido, mas não ter mais o Git o rastreando.
Isso é particularmente útil se você esqueceu de adicionar algo ao seu arquivo .gitignore e acidentalmente o preparou, como um arquivo de log grande ou um monte de arquivos .a compilados.
Para fazer isso, use a opção --cached:
$ git rm --cached README
Você pode passar arquivos, diretórios e padrões de file-glob para o comando git rm.
Isso significa que você pode fazer coisas como:
$ git rm log/\*.log
Observe a barra invertida (\) na frente do *.
Isso é necessário porque o Git faz sua própria expansão de nome de arquivo, além da expansão de nome de arquivo do seu shell.
Esse comando remove todos os arquivos que têm a extensão .log no diretório log/.
Ou você pode fazer algo assim:
$ git rm \*~
Este comando remove todos os arquivos cujos nomes terminam com um ~.
Movendo Arquivos
Ao contrário de muitos outros VCSs, o Git não rastreia explicitamente o movimento de arquivos. Se você renomear um arquivo no Git, nenhum metadado será armazenado no Git que informe que você renomeou o arquivo. No entanto, o Git é muito inteligente em descobrir isso depois do fato — lidaremos com a detecção de movimento de arquivos um pouco mais tarde.
Portanto, é um pouco confuso que o Git tenha um comando mv.
Se você quiser renomear um arquivo no Git, você pode executar algo como:
$ git mv file_from file_to
e funciona perfeitamente. De fato, se você executar algo assim e observar o status, verá que o Git o considera um arquivo renomeado:
$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
No entanto, isso é equivalente a executar algo assim:
$ mv README.md README
$ git rm README.md
$ git add README
O Git descobre que é uma renomeação implicitamente, portanto, não importa se você renomeia um arquivo dessa maneira ou com o comando mv.
A única diferença real é que git mv é um comando em vez de três — é uma função de conveniência.
Mais importante ainda, você pode usar qualquer ferramenta que desejar para renomear um arquivo e tratar o add/rm depois, antes de fazer o commit.