Por que 'git commit' não salva minhas alterações?


251

Eu fiz git commit -m "message"assim:

> git commit -m "save arezzo files"
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Mas depois, quando eu mostro git status, os mesmos arquivos modificados:

> git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

O que estou fazendo de errado?


16
Use git commit -am "save arezzo files"para adicionar automaticamente todas as alterações (wrt .gitignore). Você pode querer adicionar apenas arquivos / diretórios específicos:git add file.src
mbx

Respostas:


400

Como a mensagem diz:

nenhuma alteração adicionada ao commit (use "git add" e / ou "git commit -a")

O Git tem uma "área de preparação" na qual os arquivos precisam ser adicionados antes de serem confirmados. Você pode ler uma explicação sobre isso aqui .


Para seu exemplo específico, você pode usar:

git commit -am "save arezzo files"

(observe o extra anas bandeiras, também pode ser escrito como git commit -a -m "message"- ambos fazem a mesma coisa)

Como alternativa, se você quiser ser mais seletivo sobre o que adicionar ao commit, use o comando git add para adicionar os arquivos apropriados à área de preparação e o status git para visualizar o que está prestes a ser adicionado (lembrando-se de prestar atenção ao a redação usada).

Você também pode encontrar documentação geral e tutoriais sobre como usar o git na página de documentação do git, que fornecerá mais detalhes sobre o conceito de preparação / adição de arquivos.


Outra coisa que vale a pena conhecer é o armazenamento temporário interativo - isso permite adicionar partes de um arquivo à área de armazenamento temporário, portanto, se você tiver feito três alterações de código distintas (para funcionalidade relacionada mas diferente), poderá usar o modo interativo para dividir o alterações e adicionar / confirmar cada parte por vez. Ter confirmações específicas menores como essa pode ser útil.


@PeterBoughton, você quis dizer "adição interativa" em vez de "adição interativa"?
DJB

3
Não, eu quis dizer adição interativa.
Peter Boughton

2
O repositório local é um tipo de área de preparação antes de enviar o código para o repositório remoto. Por que adicionar mais uma "camada" antes de confirmar as alterações, não é um pouco complicado demais? Eu sou novo no git, mas imagino que 99,99% dos desenvolvedores sempre usem commit -am porque as alterações não saem do ambiente local de qualquer maneira.
precisa saber é o seguinte

2
Acho que me deparei com isso porque estou acostumada com o meu IDE cuidando disso para mim. Não tenho certeza por isso que é um passo necessário tanto, mas, novamente, há muito sobre git Eu não entendo ... Eu git média ...
trpt4him

49

Você não adicionou as alterações. Adicione-os especificamente via

git add filename1 filename2

ou adicione todas as alterações (do caminho raiz do projeto)

git add .

ou use a abreviação -aao confirmar:

git commit -a -m "message".

Além disso, peço aos usuários que usem adição interativa. Especialmente quando você está tentando fazer pequenos commits agradáveis ​​que são facilmente reversíveis.
Jer

40

Você deveria fazer:

git commit . -m "save arezzo files"

4
Essa parece ser a resposta correta para a pergunta do OP. Ele não queria "adicionar", queria confirmar o que foi modificado.
VectorVortec

8

Copiei um pequeno subprojeto que estava sob controle de origem do Git em outro projeto e esqueci de excluir a pasta .git. Quando fui confirmar, recebi a mesma mensagem acima e não consegui limpá-la até excluir a .gitpasta.

É um pouco bobo, mas vale a pena verificar se você não tem uma pasta .git na pasta que não confirma.


7

Você poderia ter feito:

git add -u -n

Para verificar quais arquivos você modificou e que serão adicionados (execução a seco: -n opção) e, em seguida,

git add -u

Para adicionar apenas arquivos modificados


4

Acho que esse problema aparece quando fiz um git add .subdiretório abaixo do local onde meu .gitignorearquivo está (o diretório inicial do meu repositório, por assim dizer). Tente alterar os diretórios para o diretório mais alto e execute, git add .seguido por git commit -m "my commit message".


4

Talvez uma coisa óbvia, mas ...

Se você tiver problemas com o índice, use git-gui . Você obtém uma visão muito boa de como o índice (área de preparação) realmente funciona.

Outra fonte de informação que me ajudou a entender o índice foi Scott Chacons "Getting Git" página 259 e adiante.

Comecei usando a linha de comando, porque a maioria da documentação mostrava apenas que ...

Eu acho que o git-gui e o gitk realmente me fazem trabalhar mais rápido, e me livrei de maus hábitos como "git pull", por exemplo ... Agora eu sempre busco primeiro ... Veja o que realmente são as novas mudanças antes de me fundir.


3

A razão pela qual isso está acontecendo é porque você tem uma pasta que já está sendo rastreada pelo Git dentro de outra pasta que também é rastreada pelo Git. Por exemplo, eu tinha um projeto e adicionei uma subpasta. Ambos estavam sendo rastreados pelo Git antes de eu colocar um dentro do outro. Para parar de rastrear o interior, localize-o e remova o arquivo Git com:

rm -rf .git

No meu caso, eu tinha um aplicativo WordPress e a pasta que adicionei foi um tema. Então eu tive que ir para a raiz do tema e remover o arquivo Git, para que todo o projeto agora fosse rastreado pelo pai, o aplicativo WordPress.


1

se você tiver mais arquivos no meu caso, tenho 7000 arquivos de imagem quando tento adicioná-los da pasta de rota do projeto, eles não foram adicionados, mas quando vou para a pasta de imagens, tudo está bem. Percorra a pasta de destino e comande como abaixo

git add .
git commit -am "image uploading"
git push origin master

git push origin master Enumerando objetos: 6574, concluído. Contando objetos: 100% (6574/6574), concluído. Compactação delta usando até 4 threads Compactação de objetos: 100% (6347/6347), concluído. Escrevendo objetos: 28% (1850/6569), 142,17 MiB | 414,00 KiB / s


0

Eu tive um problema em que estava fazendo, commit --amendmesmo depois de emitir um git add .e ainda não estava funcionando. Acontece que fiz algumas .vimrcpersonalizações e meu editor não estava funcionando corretamente. A vimcorreção desses erros para que retorne o código correto resolveu o problema.


0

Eu tive um problema muito semelhante com a mesma mensagem de erro. "Alterações não preparadas para confirmação", mas quando eu faço um diff, mostra diferenças. Finalmente descobri que, há algum tempo, havia mudado um caso de diretório. ex. "PostgeSQL" para "postgresql". Pelo que me lembro agora, às vezes o git deixa um arquivo ou dois para trás no diretório de casos antigos. Então você confirmará uma nova versão para o novo caso.

Assim, o git não sabe em quem confiar. Então, para resolvê-lo, tive que acessar o site do github. Então você poderá visualizar os dois casos. E você deve excluir todos os arquivos no diretório incorreto. Certifique-se de ter a versão correta salva ou no diretório fornecido correto.

Depois de excluir todos os arquivos do diretório antigo, esse diretório inteiro desaparecerá. Então faça um commit.

Nesse ponto, você deve poder executar um Pull no computador local e não ver mais os conflitos. Sendo assim, capaz de se comprometer novamente. :)


0

se você tiver uma subpasta que foi clonada de outro repositório git, primeiro você deverá remover o arquivo $ .git $ do repositório filho: rm -rf .git depois disso, você poderá mudar para a pasta pai e usar git add -A.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.