Diferença entre "git add -A" e "git add".

2918

O comando git add [--all|-A]parece ser idêntico a git add .. Isso está correto? Se não, como eles diferem?

cmcginty
fonte

Respostas:

4242

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 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
CB Bailey
fonte
41
E a diferença entre git add *?
Jared
3
muito ruim git add -A -pnão funciona como seria de esperar (pedir interativamente sobre arquivos untracked)
Erik Kaplun
2
Atualize a resposta. Deveria ser:git add -A :/ ougit add -A .
Gabriel Llamas
5
Para obter informações, nas versões mais recentes do git git add -u, git add -u :/o último parâmetro é um caminho, permitindo a você -u determinados diretórios, :/manipular toda a árvore.
Brizee
15
@CharlesBailey, Git realmente ama complicar as coisas sem um bom motivo. Existe um caso de uso real pelo qual alguém precisaria especificamente 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
Pacerier
946

Aqui está uma tabela para entendimento rápido:

Git versão 1.x :

Digite a descrição da imagem aqui

Git versão 2.x :

Digite a descrição da imagem aqui

Sinalizadores de formato longo:

  • git add -A é equivalente a git add --all
  • git add -u é equivalente a git add --update

Leitura adicional:

Desenvolvedor
fonte
1
Obrigado pela mesa. Existe uma maneira de adicionar apenas os arquivos que foram modificados. Não há novos arquivos ou arquivos excluídos
Gokul NK 13/15 '12
3
@ Goku: De acordo com este post , você pode git diff-files -z --diff-filter=M --name-only | xargs -0 git addadicionar apenas os arquivos modificados, mas não os novos ou as exclusões.
Ville
93
Isso não é totalmente verdade, pois 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.
Milo Wielondek
2
Então, git add .é equivalente a git add -A ., que é equivalente agit add "*"
flow2k
Ainda estou confuso sobre o git add "*", você pode elaborar um pouco mais?
SH Umer FAROOQ
176

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.

VonC
fonte
3
@NickVolynkin Isso é ótimo! Fico feliz em ver a comunidade internacional de SO funcionando como pretendido. Para referência: ru.stackoverflow.com/a/431840
VonC 26/06/2015
@VonC, Nice, o pessoal do Git realmente teve a coragem de dizer que sua atualização "tornará as coisas mais consistentes". O que eles fizeram foi criar mais confusão e inconsistências. Existem 26 alfabetos e eles tiveram que reutilizar uma bandeira que já foi usada.
Pacerier
136

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 .

Richard
fonte
6
isso não é mais verdade no 2.0. adicionar . é igual a adicionar -A para o mesmo caminho, a única diferença é se há novos arquivos em outros caminhos da árvore
Claudiu Creanga
41

As coisas mudaram com o Git 2.0 ( 28-05-2014 ):

  • -A agora é o padrão
  • O comportamento antigo está agora disponível com --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 atual
  • git add --ignore-removal . adiciona arquivos novos / modificados no diretório atual
  • git add -u . adiciona arquivos modificados / excluídos no diretório atual
  • Sem o ponto, adicione todos os arquivos no projeto, independentemente do diretório atual.
0xF
fonte
4
Eu não acho que isso esteja correto. Usando git v2.10.windows.2 'git add' retorna 'Nada especificado, nada adicionado'. 'git add -A' adiciona todos os arquivos alterados. O que sugere '-A' não é o padrão.
Neutrino
34

Uma resposta rápida mais destilada:

Os dois abaixo (o mesmo que git add --all )

git add -A

Estágios novos + arquivos modificados

git add .

Etapas modificadas + arquivos excluídos

git add -u
K. Kilian Lindberg
fonte
5
Olá, e se você só quisesse exibir apenas arquivos modificados? Como você faria isso?
TheGrapeBeyond
2
Olá, boa pergunta. Não existe um sinalizador fácil para isso, tanto quanto eu sei. Git diff-files -z --diff-filter = M --name-only | xargs -0 add git de -> stackoverflow.com/questions/14368093/...
K. Kilian Lindberg
2
Na verdade, é git add :/+git add -u :/
Nick Volynkin
27

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.

simhumileco
fonte
12

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':

  • Arquivos invisíveis, aqueles prefixados com um ponto (arquivos de ponto) nunca são reconhecidos automaticamente pelo Git. Eles nunca são listados como 'não rastreados'.
  • Pastas vazias nunca são adicionadas pelo Git. Eles nunca são listados como 'não rastreados'. (Uma solução alternativa é adicionar um arquivo em branco, possivelmente invisível, aos arquivos rastreados.)
  • O status do Git não exibirá informações da subpasta, ou seja, arquivos não rastreados, a menos que pelo menos um arquivo nessa subpasta seja rastreado. Antes desse período, o Git considera a pasta inteira fora do escopo, a la 'vazia'. Está vazio de itens rastreados.
  • Especificando um filespec = '.' (ponto) ou o diretório atual, não é recursivo, a menos que -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.

  • No Git antes da 2.0, para os dois limitadores (atualização e tudo), o novo padrão é operar em toda a árvore de trabalho, em vez do caminho atual (Git 1.9 ou anterior),
  • No entanto, na v2.0, a operação pode ser limitada ao caminho atual: basta adicionar o sufixo de ponto explícito (que também é válido no Git 1.9 ou anterior);

git add -A .

git add -u .

Em conclusão, minha política é:

  1. Certifique-se de que quaisquer pedaços / arquivos a serem adicionados sejam contabilizados em git status.
  2. Se algum item estiver faltando, devido a arquivos / pastas invisíveis, adicione-os separadamente.
  3. Tenha um bom .gitignorearquivo para que normalmente apenas os arquivos de interesse sejam não rastreados e / ou não reconhecidos.
  4. No nível superior do repositório, "git add -A" para adicionar todos os itens. Isso funciona em todas as versões do Git.
  5. Remova todos os itens desejados do índice, se desejar.
  6. Se houver um grande erro, faça 'git reset' para limpar o índice completamente.
AnneTheAgile
fonte
12

git add . é igual a git add -A . adiciona arquivos ao índice somente das pastas atuais e secundárias.

git add -A adiciona arquivos ao índice de todas as pastas na árvore de trabalho.

PS: informações relacionadas ao Git 2.0 (28-05-2014).

Alex78191
fonte
9

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.

sbr_amd
fonte
3

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.

Yehuda Schwartz
fonte