Respostas:
Essa resposta só se aplica a Git versão 1.x . Para o Git versão 2.x, consulte outras respostas.
Resumo:
git add -Arealiza todas as alterações
git add .monitora novos arquivos e modificações, sem exclusões
git add -urealiza modificações e exclusões, sem novos arquivos
Detalhe:
git add -Aé equivalente a git add .; git add -u.
O ponto importante a respeito git add .é que ele olha para a árvore de trabalho e adiciona todos esses caminhos às alterações em etapas, se elas são alteradas ou são novas e não são ignoradas, não realiza nenhuma ação 'rm'.
git add -uexamina todos os arquivos já rastreados e monitora as alterações nesses arquivos se forem diferentes ou se foram removidos. Ele não adiciona novos arquivos, apenas modifica as alterações nos arquivos já rastreados.
git add -A é um atalho útil para executar os dois.
Você pode testar as diferenças com algo assim (observe que para a versão 2.x do Git, sua saída git add . git status será diferente):
git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial
echo OK >> change-me
rm delete-me
echo Add me > add-me
git status
# Changed but not updated:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git add .
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# Changed but not updated:
# deleted: delete-me
git reset
git add -u
git status
# Changes to be committed:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git reset
git add -A
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# deleted: delete-me
git add -A -pnão funciona como seria de esperar (pedir interativamente sobre arquivos untracked)
git add -A :/ ougit add -A .
git add -u, git add -u :/o último parâmetro é um caminho, permitindo a você -u determinados diretórios, :/manipular toda a árvore.
git add -uou, git add .e ao fazer isso, torna sua vida mais fácil, mesmo depois de contabilizar o imposto mental extra adicionado para garantir que não haja problemas de sincronização? Eu me pergunto por Git faz divisão não furthur add -uem dois comandos separados add -u1e add-u2em que um funciona para arquivos começando com algarismos e outro para os arquivos começando com os não-números
Aqui está uma tabela para entendimento rápido:
Git versão 1.x :

Git versão 2.x :

Sinalizadores de formato longo:
git add -A é equivalente a git add --allgit add -u é equivalente a git add --updateLeitura adicional:
git add .apenas adiciona novos arquivos que estão no caminho atual. Ou seja, se você tem um novo diretório ../foo, git add -Airá montá-lo, git add .não.
git add .é equivalente a git add -A ., que é equivalente agit add "*"
Com o Git 2.0, git add -Aé padrão: git add .igual agit add -A . .
git add <path>é o mesmo que "git add -A <path>" agora, para que "git add dir/" observe os caminhos que você removeu do diretório e registre a remoção.
Nas versões mais antigas do Git, "git add <path>" ignora remoções.Você pode dizer "
git add --ignore-removal <path>" para adicionar apenas caminhos adicionados ou modificados<path>, se você realmente quiser.
git add -Aé como git add :/( adicione tudo da pasta superior do repositório git ).
Observe que o git 2.7 (novembro de 2015) permitirá que você adicione uma pasta chamada " :"!
Veja commit 29abb33 (25 de outubro de 2015) por Junio C Hamano ( gitster) .
Observe que ao iniciar o git 2.0 (Q1 ou Q2 2014) , ao falar sobre git add .(caminho atual dentro da árvore de trabalho), você deve usar ' .' nos outros git addcomandos também.
Que significa:
"
git add -A ." é equivalente a "git add .; git add -u ."
(Observe o extra ' .' para git add -Ae git add -u)
Porque git add -Aou git add -uoperaria (iniciando apenas o git 2.0) em toda a árvore de trabalho , e não apenas no caminho atual.
Esses comandos irão operar em toda a árvore no Git 2.0 para consistência com "
git commit -a" e outros comandos . Como não haverá mecanismo para fazer com que "git add -u" se comporte como se "git add -u .", é importante para aqueles que estão acostumados a "git add -u" (sem pathspec) atualizar o índice apenas para caminhos no subdiretório atual começarem a treinar seus dedos para dizer explicitamente "git add -u ."quando eles querem dizer isso antes do Git 2.0 chegar.Um aviso é emitido quando esses comandos são executados sem um pathspec e quando há alterações locais fora do diretório atual , porque o comportamento no Git 2.0 será diferente da versão de hoje em tal situação.
Nas instruções de Charles , depois de testar meu entendimento proposto, seria o seguinte:
# For the next commit
$ git add . # Add only files created/modified to the index and not those deleted
$ git add -u # Add only files deleted/modified to the index and not those created
$ git add -A # Do both operations at once, add to all files to the index
Esta postagem no blog também pode ser útil para entender em que situação esses comandos podem ser aplicados: Removendo arquivos excluídos do diretório de trabalho do Git .
As coisas mudaram com o Git 2.0 ( 28-05-2014 ):
-A agora é o padrão--ignore-removal.git add -ue git add -Aem um subdiretório sem caminhos na linha de comando operam em toda a árvore.Portanto, para o Git 2, a resposta é:
git add .e git add -A .adicione novos arquivos / modificados / excluídos no diretório atualgit add --ignore-removal . adiciona arquivos novos / modificados no diretório atualgit add -u . adiciona arquivos modificados / excluídos no diretório atualUma resposta rápida mais destilada:
git add -A
git add .
git add -u
git add :/+git add -u :/
No Git 2.x :
Se você estiver localizado diretamente no diretório de trabalho , em seguida, git add -Ae git add .trabalho sem a diferença.
Se você estiver em qualquer subdiretório do diretório de trabalho , git add -Airá adicionar todos os arquivos de todo o diretório de trabalho , e git add .irá adicionar arquivos de seu diretório atual .
E isso é tudo.
Espero que isso possa adicionar mais clareza.
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
Os limitadores podem ser -u ou -A ou nulos.
Pathspec pode ser um caminho de arquivo ou ponto, '.' para indicar o diretório atual.
Conhecimento importante importante sobre como o Git 'adiciona':
-Atambém seja especificado. O ponto refere-se estritamente ao diretório atual - omite os caminhos encontrados acima e abaixo.Agora, dado esse conhecimento, podemos aplicar as respostas acima.
Os limitadores são os seguintes.
-u= --update= subconjunto dos arquivos rastreados => Adicionar = Não; Mudança = Sim; Excluir = Sim. => se o item for rastreado.-A= --all(não existe -a, o que gera erro de sintaxe) = superconjunto de todos os arquivos não rastreados / rastreados, a menos que no Git anterior a 2.0, em que se o arquivo de ponto for fornecido, somente essa pasta específica seja considerada. => se o item for reconhecido, git add -Ao encontrará e o adicionará.O pathspec é o seguinte.
git add -A .
git add -u .
Em conclusão, minha política é:
git status..gitignorearquivo para que normalmente apenas os arquivos de interesse sejam não rastreados e / ou não reconhecidos.Ambos git add .e git add -Aprepararão todos os arquivos novos, modificados e excluídos nas versões mais recentes do Git.
A diferença é que os git add -Aarquivos estão em "superior, atual e subdiretórios" que pertencem ao seu repositório Git em funcionamento. Mas fazer git add .apenas estágios de arquivos no diretório atual e nos subdiretórios seguintes ( não nos arquivos localizados fora, ou seja, nos diretórios mais altos).
Aqui está um exemplo:
/my-repo
.git/
subfolder/
nested-file.txt
rootfile.txt
Se o seu diretório de trabalho atual é /my-repo, e você rm rootfile.txt, então cd subfolder, seguido por git add ., em seguida, ele irá não encenar o arquivo excluído. Mas fazer git add -Acertamente encenará essa mudança, não importa de onde você execute o comando.
A -Aopção adiciona, modifica e remove entradas de índice para corresponder à árvore de trabalho.
No Git 2, a -Aopção agora é o padrão.
Quando a .é adicionado, limita o escopo da atualização ao diretório em que você está atualmente, conforme a documentação do Git
Se não
<pathspec>for fornecido quando a opção -A for usada, todos os arquivos em toda a árvore de trabalho serão atualizados (versões antigas do Git usadas para limitar a atualização ao diretório atual e seus subdiretórios).
Uma coisa que eu acrescentaria é que, se o modo --interactiveou -pfor usado, ele git addse comportará como se o -usinalizador update ( ) fosse usado e não adicionasse novos arquivos.
git add *?