Remover arquivos do Git commit

Eu uso o git e fiz alguns arquivos usando

 git commit -a 

Mais tarde, descobri que o arquivo foi adicionado por engano ao commit.

Como deletar um arquivo do último commit?

849
18 сент. Mojoy é definido em 18 de setembro 2012-09-18 19:59 '12 em 7:59 pm 2012-09-18 19:59
@ 19 respostas

Eu acho que as outras respostas aqui estão incorretas, porque se trata de mover os arquivos fixados erroneamente de volta para a área intermediária da fixação anterior sem desfazer as alterações feitas por ele. Isso pode ser feito como sugerido por Paritosh Singh:

 git reset --soft HEAD^ 

ou

 git reset --soft HEAD~1 

Em seguida, restaure os arquivos indesejados para que não sejam enviados:

 git reset HEAD path/to/unwanted_file 

Agora tente novamente, você pode reutilizar a mesma mensagem de confirmação:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 a resposta é dada juzzlin 10 de março de 2013 às 13:56 2013-03-10 13:56

Atenção ! Se você quiser excluir um arquivo da sua confirmação anterior e salvá-lo no disco, leia a resposta do juzzlin um pouco mais alto.

Se este é seu último commit e você deseja remover completamente o arquivo do seu repositório local e remoto , você pode:

  • exclua o arquivo git rm <file>
  • confirmar com sinalizador de alteração: git commit --amend
border=0

O sinalizador de correção diz ao git para corrigir novamente, mas para "mesclar" (não no sentido de mesclar duas ramificações), corrija-o com a última correção.

E para dizer isso como yo, o comando rm no git faz o que rm si faz!

168
18 сент. Resposta dada por CharlesB 18 Set. 2012-09-18 20:22 '12 at 8:22 pm 2012-09-18 20:22

Respostas existentes sugerem a remoção de arquivos indesejados do passado .

Se você deseja excluir arquivos desnecessários do commit antigo (mesmo se pressionado) e não deseja criar um novo commit, o que é opcional devido à ação:

1

Encontre o commit que você deseja que o arquivo corresponda.

 git checkout <commit_id> <path_to_file> 

Você pode fazer isso várias vezes se quiser excluir muitos arquivos.

2

 git commit -am "remove unwanted files" 

3

Encontre o commit_id commit pelo qual os arquivos foram adicionados erroneamente , digamos, "35c23c2" aqui

 git rebase 35c23c2~1 -i // notice: "~1" is necessary 

Este comando abre o editor de acordo com suas configurações. O padrão é vim.

Mova o último commit, que deve ser "deletar arquivos desnecessários", para a próxima linha do commit errado ("35c23c2" no nosso caso) e configure o comando como fixup :

 pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

Depois de salvar o arquivo, você deve estar bem.

Para terminar:

 git push -f 

Se você, infelizmente, obtiver conflitos, deverá resolvê-los manualmente.

75
27 янв. Respondido por Brian Jan. 27 2015-01-27 18:24 '15 às 18:24 2015-01-27 18:24

Apagar um arquivo com rm irá apagá-lo!

Você sempre adiciona um commit ao git ao invés de deletá-lo, então nesta instância você retorna o arquivo para o estado em que estava antes do primeiro commit (isso pode ser a ação delete "rm" se o arquivo é novo), e então re-commit e o arquivo irá .

Para retornar um arquivo ao estado anterior:

  git checkout <commit_id> <path_to_file> 

ou devolvê-lo ao estado na cabeça remota:

  git checkout origin/master <path_to_file> 

então mude o commit e você deve achar que o arquivo desapareceu da lista (e não é deletado do seu disco!)

30
28 янв. Bob Flannigon postou uma resposta em 28 de janeiro 2013-01-28 17:00 '13 às 17:00 2013-01-28 17:00

Se você não clicou em alterações no servidor, poderá usar

 git reset --soft HEAD~1 

Ele irá redefinir todas as alterações e voltar para um commit.

Se você clicou em suas alterações, siga as etapas abaixo, conforme indicado em @CharlesB

28
18 сент. A resposta é dada por Paritosh Singh 18 de setembro . 2012-09-18 21:28 '12 às 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. Resposta dada por Denis Shchepetov em 23 de ago 2013-08-23 22:01 '13 às 10:01 pm 2013-08-23 22:01

Como a resposta aceita mostra, você pode fazer isso soltando todo o commit. Mas esta é uma abordagem bastante difícil.
Uma maneira mais limpa de fazer isso é salvar o commit e simplesmente remover os arquivos modificados dele.

 git reset HEAD^ -- path/to/file git commit --amend --no-edit 

git reset irá pegar o arquivo da mesma maneira que no commit anterior, e gerá-lo no índice. O arquivo no diretório de trabalho não é tocado.
Então git commit correções e aperta o índice no commit atual.

Ele essencialmente aceita a versão do arquivo que estava no commit anterior e o adiciona ao commit atual. Isso não altera a rede, portanto, o arquivo é efetivamente removido da confirmação.

25
25 февр. Resposta dada por Patrick em 25 Fev 2017-02-25 03:06 '17 às 3:06 2017-02-25 03:06

A seguir, você desabilitará apenas o arquivo pretendido, que é o necessário para o OP.

 git reset HEAD^ /path/to/file 

Você verá algo como o seguinte ...

Alterações que você precisa fazer: (use "git reset HEAD ..." para desinstalar)

modificado: / path / to / file

Alterações não são feitas para commitar: (use "git add ..." para atualizar o que será feito) (use "git checkout -..." para descartar as mudanças no diretório de trabalho)

modificado: / path / to / file

  • "Alterações que você precisa fazer" é uma versão anterior do arquivo antes de confirmar. Será parecido com exclusão se o arquivo nunca existiu. Se você fizer essa alteração, será exibida uma revisão que retornará a alteração para o arquivo em sua filial.
  • "Alterações não são entregues para confirmação" é a alteração que você fez e o estado atual do arquivo

Neste ponto, você pode fazer o que quiser no arquivo, por exemplo, redefinir para outra versão.

Quando você está pronto para se comprometer:

 git commit --amend -a 

ou (se você tiver outras alterações que não deseja fazer)

 git commit add /path/to/file git commit --amend 
24
07 дек. a resposta é dada ThatsAMorais 07 dez. 2014-12-07 10:13 '14 às 10:13 2014-12-07 10:13

Se você quiser salvar o commit (talvez você já tenha passado algum tempo criando uma mensagem detalhada sobre o commit e não queira perdê-lo), e você quer deletar o arquivo somente do commit, mas não do repositório completamente

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 a resposta é dada mattexx 17 de junho de 2013 às 23:07 2013-06-17 23:07
 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "removed unwanted file from git" 

vai deixar você um arquivo local. Se você também não quiser que o arquivo seja local, pule a opção --cached.

Se todo o trabalho estiver em sua filial local, você precisará salvar o arquivo em um commit posterior e, como se tivesse um histórico limpo, acho que uma maneira mais fácil de fazer isso poderia ser:

 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit --squash <commit_id> git add <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "brand new file!" git rebase --interactive <commit_id>^ 

e você pode concluir facilmente a reinicialização sem precisar memorizar comandos mais complexos ou corrigir uma mensagem ou digitar o mesmo número.

6
23 февр. A resposta é dada por Bryan Buckley em 23 de fevereiro. 2016-02-23 09:22 '16 em 9:22 am 2016-02-23 09:22

Usar a GUI do git pode facilitar a exclusão de um arquivo de um commit anterior.

Supondo que este não é um ramo compartilhado, e você não se importa de reescrever a história , então execute:

 git gui citool --amend 

Você pode cancelar o arquivo que foi consertado por engano e clicar em "Confirmar".

2019

6
18 мая '15 в 22:50 2015-05-18 22:50 a resposta é dada por JDiMatteo 18 de maio de '15 às 10:50 pm 2015-05-18 22:50

Execute uma sequência dos seguintes comandos:

 //to remove the last commit, but preserve changes git reset --soft HEAD~1 //to remove unneded file from the staging area git reset HEAD `<your file>` //finally make a new commit git commit -m 'Your message' 
5
10 сент. a resposta é dada por Sergey Onishchenko 10 de setembro . 2015-09-10 14:51 '15 às 14:51 2015-09-10 14:51

Vou explicar-lhe um exemplo: Seja A, B, C, 3 fixações consecutivas. Commit B contém um arquivo que não deveria ter sido confirmado.

  • $ git log # take Um commmit_id
  • $ git rebase -i "A_ID"
  • altere o commit para 'e' no rebase vim
  • $ git rm arquivo_antigado
  • $ git rebase continue
  • $ git push -force
3
17 авг. Resposta dada por Moaz Rashad 17 ago 2017-08-17 12:52 '17 às 12:52 2017-08-17 12:52

Eu só queria adicionar a resposta principal, já que tive que executar um comando adicional:

 git reset --soft HEAD^ git checkout origin/master <filepath> 

Viva!

3
25 мая '16 в 18:24 2016-05-25 18:24 a resposta é dada por andrepo 25 de maio de '16 at 18:24 2016-05-25 18:24

Algo que funcionou para mim, mas ainda acho que deveria haver uma solução melhor:

 $ git revert <commit_id> $ git reset HEAD~1 --hard 

Apenas deixe a alteração que você deseja cancelar em outro commit, verifique os outros.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. resposta dada por saiyancoder 14 ago. 2014-08-14 08:34 '14 às 8:34 am 2014-08-14 08:34

Na verdade, acho que a maneira mais rápida e fácil é usar o modo interativo do git.

 git rebase -i head~1 

(ou cabeça ~ 4, até onde você quer ir)

e então use 'edit' em vez de 'pick'. Eu não entendi como é poderosa a edição.

https://www.youtube.com/watch?v=2dQosJaLN18

Espero que você goste.

1
19 мая '16 в 23:58 2016-05-19 23:58 a resposta é dada por Matt May 19, '16 às 23:58 2016-05-19 23:58

Tive o mesmo problema quando eu tenho alterações no ramo local, onde eu queria retornar apenas um arquivo. O que funcionou para mim

( feature / target_branch ) onde eu tenho todas as minhas alterações, incluindo as que eu queria desfazer em um arquivo específico)

( origem / recurso / target_branch ) é o ramo remoto que eu quero fazer alterações para)

(a função / estágio é o meu ramo intermediário temporário no qual eu irei construir todas as mudanças desejadas, excluindo a modificação deste arquivo)

  • Crie uma ramificação local da minha origem / recurso / target_branch - chamou-a de função / instrução

  • Mesclando meu recurso local local / target_branch com um branch

  • A função / instrução está marcada, então git reset --soft ORIG_HEAD (agora todas as alterações da função / estágio "serão organizadas, mas não corrigidas.)

  • Arquivo desinstalado que verifiquei anteriormente com alterações desnecessárias

  • Ramo upstream alterado para função / origem / recurso / target_branch

  • Reduzir as alterações restantes em fases e clicou upstream para minha origem / função / target_branch remoto

1
23 янв. a resposta é dada por user1201303 23 jan. 2017-01-23 07:13 '17 às 7:13 2017-01-23 07:13

Se você ainda não pressionou o commit, o GitHub Desktop resolve facilmente esse problema:

  • Selecione o repositório → Desfazer a última confirmação.
  • Desmarque o arquivo que você adicionou por engano. Sua mensagem de confirmação anterior já estará na caixa de diálogo.
  • Pressione o botão de espera!
1
14 марта '17 в 22:41 2017-03-14 22:41 a resposta é dada por Ron em 14 de março '17 às 22:41 2017-03-14 22:41

Se você não precisa mais deste arquivo, você pode fazer

 git rm file git commit --amend git push origin branch 
0
29 сент. a resposta é dada em 29 de setembro . 2017-09-29 00:49 '17 às 0:49 2017-09-29 00:49

Outras questões sobre tags ou Ask a Question