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 -A
realiza todas as alterações
git add .
monitora novos arquivos e modificações, sem exclusões
git add -u
realiza 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 -u
examina 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 -p
nã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 -u
ou, 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 -u
em dois comandos separados add -u1
e add-u2
em 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 --all
git add -u
é equivalente a git add --update
Leitura 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 -A
irá 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 add
comandos também.
Que significa:
"
git add -A .
" é equivalente a "git add .; git add -u .
"
(Observe o extra ' .
' para git add -A
e git add -u
)
Porque git add -A
ou git add -u
operaria (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 -u
e git add -A
em 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 -A
e git add .
trabalho sem a diferença.
Se você estiver em qualquer subdiretório do diretório de trabalho , git add -A
irá 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':
-A
també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 -A
o encontrará e o adicionará.O pathspec é o seguinte.
git add -A .
git add -u .
Em conclusão, minha política é:
git status
..gitignore
arquivo para que normalmente apenas os arquivos de interesse sejam não rastreados e / ou não reconhecidos.Ambos git add .
e git add -A
prepararão todos os arquivos novos, modificados e excluídos nas versões mais recentes do Git.
A diferença é que os git add -A
arquivos 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 -A
certamente encenará essa mudança, não importa de onde você execute o comando.
A -A
opção adiciona, modifica e remove entradas de índice para corresponder à árvore de trabalho.
No Git 2, a -A
opçã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 --interactive
ou -p
for usado, ele git add
se comportará como se o -u
sinalizador update ( ) fosse usado e não adicionasse novos arquivos.
git add *
?