git add * (asterisco) vs git add. (período)

129

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 *.

insira a descrição da imagem aqui

Nota: Entendo o que significa usar o asterisco como curinga (adicione todos os arquivos com uma determinada extensão). Por exemplo, git add *.htmlgostaria de acrescentar todos os arquivos que têm uma .htmlextensão (mas ignoram .css, .js, etc).

Obrigado pela ajuda!

Tyler Youngblood
fonte
1
De onde é esse gráfico? Acabei de tentar git add .novamente e ele encenou um arquivo excluído sem problemas, ao contrário do Xsugerido nessa linha.
David
@ David Essa imagem é desta resposta e se aplica a versões mais antigas do git.
jerry
4
Imagem desatualizada! O Git 2.x é diferente: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Respostas:

131

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.

Denis
fonte
6
então git add .adiciona todos os arquivos, pastas e subpastas, incluindo .gitignore e qualquer outra coisa que começa com um ponto, enquanto git add *acrescentaria quaisquer arquivos, pastas e subpastas, exceto aqueles que estão começando com um ponto? Isso é preciso?
Tyler Youngblood
9
Isso é realmente correto. Além disso, git add *ainda adicionaria arquivos começando com um ponto se eles estiverem em um subdiretório.
Denis
4
git add .também respeita o .gitignore, ao passo que gera git add *um erro se algum arquivo que não seja ponto é gitignored. Muito melhor usar do git add .que git add *.
rosuav
2
Vale notar: se invocar o Git no DOS / Windows a partir do CMD.EXE, é o Git , não o shell, que expande o arquivo *. Nesse caso, o Git encontrará arquivos de ponto.
Torek
2
@ Thor84no: O Git encontrará os arquivos de ponto mesmo em um sistema Linux, se você citar o *para protegê-lo do shell. Não é uma questão de parte oculta, é apenas que as regras compiladas do Git diferem.
torek 8/01/19
30

*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, que addsão todos eles. .é o próprio diretório atual e git addo adicionará a todos os arquivos nele contidos.

Mureinik
fonte
1
Então, haveria uma razão para usar o asterisco? Existe alguma vantagem em usá-lo em vez de um período? Ou vice-versa? Tenho certeza de que vi em um tutorial. Eu não saberia usá-lo de outra forma. Eu não sou muito cara de linha de comando (como você sem dúvida adivinhou).
Tyler Youngblood
5
*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 usaria git add -u(ou git add -Ase você estiver criando novos arquivos).
Mureinik 25/09
3
Como vocês dois responderam à minha pergunta, tive problemas para decidir a quem dar crédito. Eu escolhi Denis abaixo porque ele tem menos reputação que você. Então imaginei que dar a ele o cheque verde o beneficiaria mais do que você. Espero que faça sentido? Mas eu realmente aprecio as duas explicações. Obrigado!
Tyler Youngblood
7

Usar o ponto . no shell geralmente significa "o diretório atual".

Quando você usa o asterisco *em um shell, um recurso chamado file-globbingé utilizado. Por exemplo, no bash, a função glob()está fazendo exatamente isso. A página de manual para glob ( man 7 glob) declara:

DESCRIÇÃO

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

Correspondência curinga

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

Globbing

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

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 addespera 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 o git add .git, ele se expandirá para o diretório atual, ao passo que git 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.

codingdave
fonte
5

Para maior clareza, coloquei a resposta na tabela abaixo:

insira a descrição da imagem aqui

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 comando git add .ou git 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 -Ae git add -upodem ser refinados ainda mais adicionando um caminho ou máscara para arquivos, por exemplo, git add -A app/controllersou git add -u app\styles\*.

simhumileco
fonte
2
Então, a partir do Git v2.x git add -Ae git add .são idênticos?
reka18
Obrigado @ reka18, por uma pergunta muito boa. Ele me inspirou a completar minha resposta ... A resposta para sua pergunta: se você chamá-lo no diretório de trabalho, não, mas se estiver em um subdiretório, então sim ( git add -Aaplica-se a todo o diretório de trabalho e git add .sempre ao diretório atual).
simhumileco
2
  • git add -A (--all) Adiciona tudo, para que tudo na sua pasta no disco seja representado na área intermediária

  • git add . Prepara tudo, mas não remove os arquivos que foram excluídos do disco

  • git 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 disco

  • git add -u (--update) Prepara apenas arquivos modificados, remove arquivos que foram excluídos do disco, não adiciona novos

  • git add <file name 1> <file name 2> Adiciona apenas certos arquivos

Steffen
fonte