Eu sou novo no git e tenho uma pergunta sobre como adicionar arquivos no git. Eu encontrei várias perguntas stackoverflow sobre a diferença entre git add .
e git add -a
, git add --all
, git add -A
, etc. Mas eu fui incapaz de encontrar um lugar que explica o que git add *
faz. Eu até olhei a página de manual git add , mas não ajudou. Eu tenho usado no lugar dele git add .
e meu colega de trabalho me perguntou o porquê. Eu não tive uma resposta. Eu sempre usei git add *
.
São git add .
e git add *
iguais? Um adiciona arquivos alterados apenas do diretório atual, enquanto o outro adiciona arquivos do diretório atual e dos subdiretórios (recursivamente)?
Há um ótimo gráfico listado em uma das outras perguntas da pilha que mostra a diferença entre git add -A
git add .
e git add -u
, mas não tem git add *
.
Nota: Entendo o que significa usar o asterisco como curinga (adicione todos os arquivos com uma determinada extensão). Por exemplo, git add *.html
gostaria de acrescentar todos os arquivos que têm uma .html
extensão (mas ignoram .css
, .js
, etc).
Obrigado pela ajuda!
fonte
git add .
novamente e ele encenou um arquivo excluído sem problemas, ao contrário doX
sugerido nessa linha.Respostas:
add *
significa adicionar todos os arquivos no diretório atual, exceto os arquivos cujo nome começa com um ponto. Esta é a sua funcionalidade de shell e o Git apenas recebe uma lista de arquivos.add .
não tem um significado especial no seu shell e, portanto, o Git adiciona todo o diretório recursivamente, que é quase o mesmo, mas inclui arquivos cujos nomes começam com um ponto.fonte
git add .
adiciona todos os arquivos, pastas e subpastas, incluindo .gitignore e qualquer outra coisa que começa com um ponto, enquantogit add *
acrescentaria quaisquer arquivos, pastas e subpastas, exceto aqueles que estão começando com um ponto? Isso é preciso?git add *
ainda adicionaria arquivos começando com um ponto se eles estiverem em um subdiretório.git add .
também respeita o .gitignore, ao passo que geragit add *
um erro se algum arquivo que não seja ponto é gitignored. Muito melhor usar dogit add .
quegit add *
.*
. Nesse caso, o Git encontrará arquivos de ponto.*
para protegê-lo do shell. Não é uma questão de parte oculta, é apenas que as regras compiladas do Git diferem.*
não faz parte do git - é um curinga interpretado pelo shell.*
expande para todos os arquivos no diretório atual e só é passado para o git, queadd
são todos eles..
é o próprio diretório atual egit add
o adicionará a todos os arquivos nele contidos.fonte
*
evita arquivos ocultos (ou seja, arquivos cujo nome começa com a.
). De qualquer forma, se você não estiver adicionando arquivos específicos, eu usariagit add -u
(ougit add -A
se você estiver criando novos arquivos).Usar o ponto
.
no shell geralmente significa "o diretório atual".Quando você usa o asterisco
*
em um shell, um recurso chamadofile-globbing
é utilizado. Por exemplo, no bash, a funçãoglob()
está fazendo exatamente isso. A página de manual para glob (man 7 glob
) declara:Isso significa que quando você passa argumentos para qualquer programa na linha de comando que contenha
'?'
,'*'
ou'['
, primeiro o globbing expande o padrão curinga para uma lista de arquivos e depois fornece esses arquivos como argumento para o próprio programa.A diferença de significado entre
'git add .'
e'git add *'
é claramente descrita por Denis :git add
espera que uma lista de arquivos seja adicionada. No exemplo acima, o shell se expande*
ou.
respectivamente e fornece o resultado como um parâmetro para o git add. Agora, a diferença é que, com ogit add .
git, ele se expandirá para o diretório atual, ao passo quegit add *
aciona o globbing de arquivos e isso se expande para todos os arquivos e diretórios que não começam com um ponto.fonte
Para maior clareza, coloquei a resposta na tabela abaixo:
Notas Adicionais (inspiradas no comentário @ reka18):
Nota 1.
git add -A
egit add -u
comandos executados sem parâmetros adicionais seriam refinamentos adicionais (subdiretório ou indicação de máscara para o nome do arquivo) funcionam no intervalo de todo o diretório ativo (também se executarmos o comando no subdiretório ativo do diretório).Nota 2. O
.
e*
são, respectivamente, o caminho do diretório (diretório atual) e o curinga, que esclarecem o caminho do comando. Por exemplo, se o comandogit add .
ougit add *
for executado em algum subdiretório de um diretório ativo, sua ação será usada apenas dentro desse subdiretório, não no diretório ativo inteiro.Nota 3. Os comandos
git add -A
egit add -u
podem ser refinados ainda mais adicionando um caminho ou máscara para arquivos, por exemplo,git add -A app/controllers
ougit add -u app\styles\*
.fonte
git add -A
egit add .
são idênticos?git add -A
aplica-se a todo o diretório de trabalho egit add .
sempre ao diretório atual).git add -A
(--all) Adiciona tudo, para que tudo na sua pasta no disco seja representado na área intermediáriagit add .
Prepara tudo, mas não remove os arquivos que foram excluídos do discogit add *
Prepara tudo, mas não os arquivos que começam com um ponto e não remove os arquivos que foram excluídos do discogit add -u
(--update) Prepara apenas arquivos modificados, remove arquivos que foram excluídos do disco, não adiciona novosgit add <file name 1> <file name 2>
Adiciona apenas certos arquivosfonte