git-commit Remover arquivos do Git commit



10 Answers

ATENÇÃO ! Se você quiser apenas remover um arquivo do seu commit anterior e mantê-lo no disco , leia a resposta do juzzlin logo acima.

Se este for seu último commit e você quiser excluir completamente o arquivo do seu repositório local e remoto , você pode:

  1. remova o arquivo git rm <file>
  2. commit com o sinalizador de alteração: git commit --amend

O sinalizador de alteração diz ao git para confirmar novamente, mas "mesclar" (não no sentido de mesclar dois ramos) este commit com o último commit.

Como dito nos comentários, usar o git rm aqui é como usar o próprio comando rm !

git git-commit

Eu estou usando o Git e eu cometi poucos arquivos usando

git commit -a

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

Como posso remover um arquivo do último commit?




Como a resposta aceita indica, você pode fazer isso redefinindo todo o commit. Mas esta é uma abordagem bastante pesada.
Uma maneira mais limpa de fazer isso seria manter o commit e simplesmente remover os arquivos alterados dele.

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

A git reset o arquivo como estava no commit anterior e o colocará no índice. O arquivo no diretório de trabalho está intacto.
O git commit irá então confirmar e esmagar o índice no commit atual.

Isso essencialmente pega a versão do arquivo que estava no commit anterior e o adiciona ao commit atual. Isso resulta em nenhuma alteração de rede e, portanto, o arquivo é efetivamente removido da confirmação.




Remover o arquivo usando rm irá apagá-lo!

Você está sempre adicionando a um commit no git ao invés de remover, então nesta instância retorne o arquivo para o estado em que estava antes do primeiro commit (isso pode ser uma ação delete 'rm' se o arquivo é novo) e então re-commit e o arquivo irá.

Para retornar o arquivo para algum estado anterior:

    git checkout <commit_id> <path_to_file>

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

    git checkout origin/master <path_to_file>

Em seguida, alterar o commit e você deve encontrar o arquivo desapareceu da lista (e não excluído do seu disco!)




O seguinte irá unstage apenas o arquivo que você pretendia, que é o que o OP pediu.

git reset HEAD^ /path/to/file

Você verá algo como o seguinte ...

Alterações a serem cometidas: (use "git reset HEAD ..." para unstage)

modificado: / caminho / para / arquivo

Mudanças não preparadas para commit: (use "git add ..." para atualizar o que será confirmado) (use "git checkout - ..." para descartar as mudanças no diretório de trabalho)

modificado: / caminho / para / arquivo

  • "Alterações a serem confirmadas" é a versão anterior do arquivo antes do commit. Isso será parecido com uma exclusão se o arquivo nunca existiu. Se você confirmar essa alteração, haverá uma revisão que reverte a alteração no arquivo em sua ramificação.
  • "Alterações não preparadas para confirmação" é a alteração que você cometeu e o estado atual do arquivo

Neste ponto, você pode fazer o que quiser no arquivo, como redefinir para uma versão diferente.

Quando você estiver pronto para cometer:

git commit --amend -a

ou (se você tem outras mudanças acontecendo que você não quer cometer, ainda)

git commit add /path/to/file
git commit --amend



Se você quiser preservar seu commit (talvez você já tenha passado algum tempo escrevendo uma mensagem de commit detalhada e não queira perdê-la), e você só quer remover o arquivo do commit, mas não do repositório inteiramente:

git checkout origin/<remote-branch> <filename>
git commit --amend



git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"

vai deixar você o arquivo local ainda. Se você não quiser o arquivo localmente, você pode pular a opção --cached.

Se todo o trabalho está em sua filial local, você precisa manter o arquivo em um commit posterior, e como ter um histórico limpo, eu acho que uma maneira mais simples 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 terminar o rebase com facilidade sem precisar lembrar de comandos mais complexos ou enviar mensagens ou digitar muito.




Só queria complementar a resposta principal como eu tive que executar um comando extra:

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

Felicidades!




git reset --soft HEAD^ retorna seu commit, e quando você digita git status , ele diz o que fazer:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)



Tive o mesmo problema em que eu tinha alterações em uma ramificação local onde eu queria reverter apenas um arquivo. O que funcionou para mim foi -

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

( origem / recurso / target_branch é o ramo remoto para onde eu quero enviar minhas alterações)

( feature / staging é o meu ramo temporário onde eu estarei empurrando de todas as minhas mudanças desejadas excluindo a mudança para aquele arquivo)

  1. Criar um ramo local a partir da minha origem / recurso / target_branch - chamado de recurso / teste

  2. Mesclou meu recurso de ramificação local / target_branch no recurso / ramo de preparação

  3. Recurso check out / staging, em seguida, git reset --soft ORIG_HEAD (Agora, todas as alterações do recurso / staging 'serão testadas, mas não confirmadas.)

  4. Desvendou o arquivo que eu verifiquei anteriormente com alterações desnecessárias

  5. Mudou o ramo de upstream para feature / staging para origin / feature / target_branch

  6. Comprometido com o restante das alterações preparadas e enviado a montante para minha origem / recurso / target_branch remoto




Se você está usando o GitHub e ainda não enviou o commit, o GitHub Desktop resolve esse problema facilmente:

  1. Escolha Repository -> Undo Most Recent Commit
  2. Desmarque o arquivo que você adicionou por engano. Sua mensagem de confirmação anterior já estará na caixa de diálogo.
  3. Pressione o botão Commit!



Related