Como cancelar 'git add' antes de confirmar?

Eu por engano adicionei arquivos para git com o comando:

 git add myfile.txt 

Eu ainda não git commit . Existe uma maneira de cancelar isso para que esses arquivos não sejam incluídos no commit?


No momento, existem 48 respostas (algumas excluídas). Por favor, não adicione um novo se você não tiver novas informações.

7856
08 дек. definido por paxos1977 08 dez. 2008-12-08 00:57 '08 em 0:57 2008-12-08 00:57
@ 34 respostas
  • 1
  • 2

Você pode cancelar git add antes de se comprometer com

 git reset <file> 

que irá removê-lo do índice atual (a lista "prestes a se comprometer") sem alterar nada.

Você pode usar

 git reset 

sem qualquer nome de arquivo para desabilitar todas as alterações. Isso pode ser útil quando muitos arquivos são listados um por um em um tempo razoável.

Em versões mais antigas do Git, os comandos acima são equivalentes ao git reset HEAD <file> e git reset HEAD respectivamente, e não terão sucesso se HEAD for indefinido (porque você não cometeu nenhum commit no seu repositório) ou ambíguo (porque você criou um branch com nome HEAD , que é uma coisa estúpida que você não deveria fazer). Isso foi mudado no Git 1.8.2 , embora nas versões modernas do Git você possa usar os comandos acima antes de criar seu primeiro commit:

"git reset" (sem parâmetros ou parâmetros) usado para você não tem nenhum compromisso em seu histórico, mas agora ele fornece um índice vazio (para corresponder a um commit não existente, você nem está incluído).

8850
08 дек. resposta é dada genehack 08 dez. 2008-12-08 01:30 '08 às 1:30 2008-12-08 01:30

Você quer:

 git rm --cached <added_file_to_undo> 

Fundamentação:

Quando eu era novo nisso, eu tentei pela primeira vez

 git reset . 

(para cancelar todos os meus uploads iniciais), apenas para obter esta mensagem (não muito) útil:

 fatal: Failed to resolve 'HEAD' as a valid ref. 

Acontece que isso ocorre porque o link HEAD (branch?) Existe somente após o primeiro commit. Ou seja, você encontrará o mesmo problema newbie que eu, se o seu fluxo de trabalho, como o meu, for mais ou menos assim:

  1. Vá para o meu novo diretório de projetos para experimentar o Git, a nova ânsia
  2. git init
  3. git add.
  4. git status

    ... muitos rolos de porcaria ...

    > Porra, eu não queria adicionar tudo isso.

  5. google "cancel git add"

    => encontrar estouro de pilha - ooh

  6. git reset.

    => fatal: não foi possível resolver 'HEAD' como um link válido.

Além disso, verifica-se que uma mensagem de erro está registrada na lista de distribuição.

E que a decisão certa estava ali na saída de status do Git (que, sim, eu chamei de "porcaria")

border=0
 ... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ... 

E a solução é realmente usar git rm --cached FILE .

Observe os avisos em outro lugar aqui - git rm exclui sua cópia de trabalho local do arquivo, mas não se você usar --cached . Aqui está o resultado do git help rm :

--cached Use esta opção para remover e remover caminhos apenas do índice. Arquivos da área de trabalho, modificados ou não, permanecerão.

Estou começando a usar

 git rm --cached . 

apagar tudo e começar de novo. Não funcionou, porque, apesar de add. é recursivo, verifica-se que rm precisa -r para recursão. Suspiro

 git rm -r --cached . 

Ok, agora estou de volta para onde comecei. Da próxima vez eu vou usar -n para o -n executar e ver o que será adicionado:

 git add -n . 

Arquivei tudo em um lugar seguro antes de confiar em git help rm para dizer que --cached não destrói nada (e se eu escrevesse errado).

2013
25 марта '09 в 19:20 2009-03-25 19:20 a resposta é dada pelo ruibarb em 19 de março de 2009 às 19:20 2009-03-25 19:20

Se você digitar:

 git status 

O git lhe dirá o que está acontecendo, etc., incluindo instruções sobre como desconectar:

 use "git reset HEAD <file>..." to unstage 

Eu acho que o git faz um bom trabalho me empurrando para fazer a coisa certa nessas situações.

Nota Versões recentes de git (1.8.4.x) mudaram esta mensagem:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. A resposta é dada por Paul Beckingham 08 de dezembro. 2008-12-08 02:22 '08 at 2:22 am 2008-12-08 02:22

Para esclarecer: git add move mudanças do diretório de trabalho atual para uma área intermediária (índice).

Este processo é chamado intermediário. Assim, o comando mais natural para alterar alterações (arquivos modificados) é óbvio:

 git stage 

git add é apenas um apelido para o git stage

É uma pena que não git unadd git unstage e git unadd . A questão correspondente é mais difícil de adivinhar ou lembrar, mas bastante óbvia:

 git reset HEAD -- 

Podemos facilmente criar um alias para isso:

 git config --global alias.unadd 'reset HEAD --' git config --global alias.unstage 'reset HEAD --' 

E finalmente, temos novas equipes:

 git add file1 git stage file2 git unadd file2 git unstage file1 

Pessoalmente, uso pseudônimos ainda mais curtos:

 git a #for staging git u #for unstaging 
232
10 сент. A resposta leva 10 de setembro 2010-09-10 23:28 '10 às 23:28 2010-09-10 23:28

Além da resposta aceita, se o seu arquivo adicionado por engano era enorme, você provavelmente notará que, mesmo depois de removê-lo do índice usando " git reset ", ele ainda ocorre no diretório .git . Você não deve se preocupar com isso, o arquivo ainda está no repositório, mas apenas como um “objeto livre”, ele não será copiado para outros repositórios (via clone, push), e o espaço será eventualmente liberado - embora talvez não muito em breve . Se você está preocupado, você pode executar:

 git gc --prune=now 

Atualização (daqui em diante, tentarei eliminar alguma confusão que possa surgir das respostas com o maior número de votos):

Então, qual é o cancelamento real do git add ?

git reset HEAD <file> ?

ou

git rm --cached <file> ?

Estritamente falando, e se não me engano: não .

git add não pode ser desfeito - com segurança, em geral.

Vamos primeiro lembrar o que o git add <file> realmente faz:

  1. Se <file> não foi rastreado anteriormente , git add adiciona ao cache com seu conteúdo atual.

  2. Se o <file> <file> sendo rastreado , o git add salvará o conteúdo atual (instantâneo, versão) no cache. No GIT, essa ação ainda é chamada de adição (e não apenas atualização), porque duas versões diferentes (snapshots) de um arquivo são tratadas como dois elementos diferentes: portanto, adicionamos um novo item ao cache, para que isso seja feito posteriormente.

Em vista disso, a questão é um tanto ambígua:

Eu, por engano, adicionei arquivos usando o comando ...

O script OP parece ser o primeiro (arquivo não rastreado), queremos "desfazer" para excluir o arquivo (e não apenas o conteúdo atual) dos itens monitorados. Se assim for , então você pode executar git rm --cached <file> .

E também podemos executar o git reset HEAD <file> . Em geral, isso é preferível porque funciona nos dois cenários: também cancela ações quando adicionamos, por engano, uma versão de um item já rastreado.

Mas existem duas ressalvas.

Primeiro: existe (como indicado na resposta) apenas um script no qual git reset HEAD não funciona, mas git rm --cached funciona: um novo repositório (sem commits). Mas, na verdade, isso é praticamente irrelevante.

Em segundo lugar, tenha em mente que o git reset HEAD não pode restaurar magicamente o conteúdo do arquivo armazenado em cache, ele simplesmente o re-sincroniza com o HEAD. Se nosso git add incorreto substituiu a versão anterior não confirmada, não poderemos recuperá-la. Portanto, estritamente falando, não podemos cancelar [*].

Exemplo:

 $ git init $ echo "version 1" > file.txt $ git add file.txt # first add of file.txt $ git commit -m 'first commit' $ echo "version 2" > file.txt $ git add file.txt # stage (don't commit) "version 2" of file.txt $ git diff --cached file.txt -version 1 +version 2 $ echo "version 3" > file.txt $ git diff file.txt -version 2 +version 3 $ git add file.txt # oops we didn't mean this $ git reset HEAD file.txt # undo ? $ git diff --cached file.txt # no dif, of course. stage == HEAD $ git diff file.txt # we have lost irrevocably "version 2" -version 1 +version 3 

Claro, isso não é muito importante se apenas seguirmos o fluxo de trabalho preguiçoso usual de executar o 'git add' apenas para adicionar novos arquivos (case 1), e nós atualizaremos o novo conteúdo com o comando commit, git commit -a .


* (Edit: O acima é quase correto, mas ainda pode haver várias maneiras de recuperar as mudanças que foram entregues, mas não corrigidas, e então sobrescritas - veja os comentários de Johannes Matokich e iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 Resposta é dada por leonbloy em 18 de maio, '11 at 21:05 2011-05-18 21:05
 git rm --cached . -r 

irá "adicionar" tudo o que você adicionou a partir do diretório atual recursivamente

89
10 дек. resposta dada por braitsch 10 dez. 2009-12-10 00:19 '09 às 0:19 2009-12-10 00:19

Correr

 git gui 

e apague todos os arquivos manualmente ou selecionando todos eles e apertando o botão de commit com commit.

83
12 окт. Resposta dada por Khaja Minhajuddin em 12 de out 2011-10-12 04:12 '11 às 4:12 em 2011-10-12 04:12

O Git tem comandos para cada ação imaginável, mas precisa de extenso conhecimento para acertar as coisas e, por isso, é contra-intuitivo na melhor das hipóteses ...

O que você fez antes:

  • Alterei o arquivo e use git add . ou git add <file> .

O que você quer:

  • Remova o arquivo do índice, mas salve nas versões e saia com as alterações não corrigidas na cópia de trabalho:

     git reset head <file> 
  • Redefina o arquivo com o status mais recente de HEAD, descartando as alterações e excluindo-as do índice:

29 марта '13 в 14:14 2013-03-29 14:14 a resposta é dada sjas 29 de março, '13 às 14:14 2013-03-29 14:14

Para cancelar um arquivo que já tenha sido adicionado é bem simples, usando o git , para resetar o arquivo myfile.txt que já foi adicionado, use:

 git reset HEAD myfile.txt 

Explique:

Depois de colocar arquivos desnecessários para cancelar, você pode git reset , Head é git reset seu arquivo na rede local, e o último parâmetro é o nome do seu arquivo.

Eu crio as etapas mostradas na figura abaixo, com mais detalhes para você, incluindo todas as etapas que podem ocorrer nos seguintes casos:

2019

28 июня '17 в 13:43 2017-06-28 13:43 A resposta é dada por Alireza em 28 de junho '17 às 1:43 pm 2017-06-28 13:43

A questão não é claramente solicitada. A razão é que o git add tem dois significados:

  • adicione um novo arquivo à área de preparação e cancele com git rm --cached file .
  • Adicionando um arquivo que foi modificado para uma área de preparação, então cancele com o git reset HEAD file .

em caso de dúvida, use

 git reset HEAD file 

Porque em ambos os casos a coisa esperada é esperada.

Atenção: se você fizer o git rm --cached file no arquivo for alterado (o arquivo que existia anteriormente no repositório), então o arquivo será deletado no git commit ! Ele ainda existirá em seu sistema de arquivos, mas se outra pessoa extrair sua confirmação, o arquivo será removido de sua árvore de trabalho.

git status informa se o arquivo foi novo ou alterado :

 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: my_new_file.txt modified: my_modified_file.txt 
69
16 янв. A resposta foi dada por Michael_Scharf 16 de jan 2014-01-16 22:54 '14 às 22:54 2014-01-16 22:54

Se você estiver usando sua confirmação original e não puder usar o git reset, apenas declare "Git bankruptcy" e exclua a pasta .git e comece com ela.

58
19 нояб. Resposta dada por Paul Betts 19 de nov 2009-11-19 19:39 '09 às 19:39 2009-11-19 19:39

Como com muitas outras respostas, você pode usar o git reset

MAS:

Eu encontrei esta mensagem maravilhosa que realmente adiciona um comando git unadd (bem, alias) para git unadd : veja git unadd para detalhes ou ..

Apenas

 git config --global alias.unadd "reset HEAD" 

Agora você pode

 git unadd foo.txt bar.txt 
54
01 окт. a resposta é dada por electblake 01 de outubro . 2010-10-01 17:54 '10 às 17:54 2010-10-01 17:54

git remove ou git rm pode ser usado para isso com o sinalizador --cached . Tente:

 git help rm 
45
08 дек. a resposta é dada por gnud 08 dez. 2008-12-08 01:00 '08 às 1:00 2008-12-08 01:00

Use git add -i para remover arquivos recém-adicionados do seu próximo commit. Exemplo:

Adicionando um arquivo que você não precisa:

 $ git add foo $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: foo # # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...]# 

Ative o add interativo para cancelar o seu add (comandos digitados em git aqui: "r" (return), "1" (a primeira entrada na lista retornará), "return" para sair do modo de retorno, e "q" (quit):

 $ git add -i staged unstaged path 1: +1/-0 nothing foo *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> r staged unstaged path 1: +1/-0 nothing [f]oo Revert>> 1 staged unstaged path * 1: +1/-0 nothing [f]oo Revert>> note: foo is untracked now. reverted one path *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> q Bye. $ 

O que é isso! Aqui está sua prova mostrando que "foo" retorna à lista sem deixar vestígios:

 $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...] # foo nothing added to commit but untracked files present (use "git add" to track) $ 
41
18 апр. Resposta dada por Alex North-Keys em 18 de abril 2012-04-18 15:53 '12 at 3:53 pm 2012-04-18 15:53

Aqui você pode evitar esse problema desagradável ao lançar um novo projeto:

  • Crie um diretório base para seu novo projeto.
  • Execute git init .
  • Agora crie um arquivo .gitignore (mesmo se estiver vazio).
  • Corrija o arquivo .gitignore.

O Git torna muito difícil fazer uma git reset se você não tiver commits. Se você criar um pequeno commit inicial apenas por causa dele, então você pode git add -A e git reset quantas vezes você quiser que tudo esteja correto.

Outra vantagem deste método é que se você encontrar problemas de conclusão de linha mais tarde e precisar atualizar todos os seus arquivos, será fácil:

  • Observe que a correção inicial. Isso excluirá todos os seus arquivos.
  • Em seguida, verifique seu último commit novamente. Isso restaurará cópias novas de seus arquivos usando as configurações atuais de final de linha.
36
25 сент. Resposta dada por Ryan Lundy 25 set 2011-09-25 02:34 '11 às 2:34 em 2011-09-25 02:34

Talvez o Git tenha evoluído desde que você postou sua pergunta.

 $> git --version git version 1.6.2.1 

Agora você pode tentar:

 git reset HEAD . 

Isso deve ser o que você está procurando.

32
19 нояб. A resposta é dada por Kokotte23 19 de novembro. 2009-11-19 19:38 '09 às 19:38 2009-11-19 19:38

Observe que, se você não especificou uma revisão, deverá incluir um separador. Um exemplo do meu console:

 git reset <path_to_file> fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree. Use '--' to separate paths from revisions git reset -- <path_to_file> Unstaged changes after reset: M <path_to_file> 

(versão 1.7.5.4 do git)

32
23 янв. a resposta é dada powlo 23 jan. 2012-01-23 19:57 '12 às 19:57 2012-01-23 19:57

Para remover novos arquivos da área de preparação (e somente no caso de um novo arquivo), como sugerido acima:

 git rm --cached FILE 

Use rm --cache apenas para novos arquivos adicionados acidentalmente.

29
22 июня '09 в 14:58 2009-06-22 14:58 a resposta é dada para Ran em 22 de junho de 2009 às 14:58 2009-06-22 14:58

Em redefinir todos os arquivos em uma pasta específica (e suas subpastas), você pode usar o seguinte comando:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 a resposta é dada Zorayr 26 de julho de 2012 às 10:50 2012-07-26 10:50

use o comando * para processar vários arquivos de uma só vez

 git reset HEAD *.prj git reset HEAD *.bmp git reset HEAD *gdb* 

e assim por diante

23
28 авг. boulder_ruby é a resposta 28 de agosto. 2013-08-28 00:15 '13 às 0:15 2013-08-28 00:15

Apenas digite git reset , ele retornará, e parece que você nunca inseriu git add . desde o último commit. Certifique-se de fazer isso antes.

21
19 мая '10 в 6:49 2010-05-19 06:49 Resposta é dada por Donovan em 19 de maio de 2010 às 06:49 2010-05-19 06:49

Suponha que eu crie um novo arquivo newFile.txt .

2019

04 окт. a resposta é dada por Vidura Mudalige 04 de outubro . 2016-10-04 14:02 '16 às 2:02 pm 2016-10-04 14:02

Para um arquivo específico:

  • git reset my_file.txt
  • git checkout my_file.txt

Para todos os arquivos adicionados:

  • git reset
  • Git checkout.

Nota: o check - out altera o código nos arquivos e vai para o último estado atualizado (confirmado). reset não altera os códigos; ele apenas solta a manchete.

15
28 окт. a resposta é dada por Hasib Kamal em 28 de outubro. 2017-10-28 09:03 '17 às 9:03 2017-10-28 09:03

Este comando muda suas mudanças:

 git reset HEAD filename.txt 

Você também pode usar

 git add -p 

para adicionar partes de arquivos.

12
31 янв. A resposta é dada wallerjake Jan 31 2013-01-31 18:43 '13 às 18:43 2013-01-31 18:43

Estou surpreso que ninguém mencione o modo interativo:

 git add -i 

Selecione a opção 3 para adicionar arquivos. No meu caso, muitas vezes eu quero adicionar vários arquivos, on-line, você pode usar esses números para adicionar arquivos. Leva apenas 4: 1,2,3,5

Para selecionar uma sequência, basta digitar 1-5 para levar tudo de 1 a 5.

Arquivos intermediários Git

12
22 окт. Responder a Jonathan 22 de outubro. 2015-10-22 16:03 '15 às 16:03 2015-10-22 16:03

Para cancelar o git add use

git reset filename

12
02 окт. Resposta dada por Anirudh Sood 02 oct. 2016-10-02 18:54 '16 às 18:54 2016-10-02 18:54

git add myfile.txt # isso adicionará seu arquivo à lista de commit

Ao contrário deste comando,

 git reset HEAD myfile.txt # this will undo it. 

Então, você estará no estado anterior. o especificado será novamente na lista sem um rastreio (estado anterior).

Ele irá redefinir a cabeça com o arquivo especificado. então se a sua cabeça não tem isso, é só resetar

8
27 июня '17 в 16:58 2017-06-27 16:58 Resposta é dada por Mohideen ibn Mohammed em 27 de junho '17 às 16:58 2017-06-27 16:58
 git reset filename.txt 

Remove o arquivo denominado filename.txt do índice atual, a área "prestes a ser confirmado", sem alterar nada.

8
11 июля '16 в 21:40 2016-07-11 21:40 Resposta é dada por Rahul Sinha em 11 de julho '16 às 21:40 2016-07-11 21:40

No SourceTree, você pode fazer isso facilmente via gui. Você pode verificar qual comando o sourcetree usa para desabilitar o arquivo.

Eu criei um novo arquivo e o adicionei ao git. Então eu desliguei usando o guit SourceTree. Este é o resultado:

Desvendar arquivos [08/12/15 10:43]
git -c diff. mnemonicprefix = false -c core. quotepath = credenciais false -c. helper = sourcetree reset -q - caminho /to/file/filename.java

O SourceTree usa o reset para desabilitar novos arquivos.

7
08 дек. a resposta é dada por miva2 08 dez. 2015-12-08 12:58 '15 às 12:58 2015-12-08 12:58
 git reset filename.txt 

Remove o arquivo denominado filename.txt do índice atual, a área "prestes a ser confirmado", sem alterar nada.

6
26 окт. Resposta dada por Joseph Mathew em 26 Out 2017-10-26 21:15 '17 às 21:15 2017-10-26 21:15
  • 1
  • 2

Outras questões sobre rotular ou Ask a Question