Geralmente, para descartar as alterações em um arquivo, você faria:
git checkout -- <file>
E se a alteração que eu quiser descartar estiver excluindo o arquivo? A linha acima daria um erro:
error: pathspec '<file>' did not match any file(s) known to git.
Qual comando restaurará esse arquivo único sem desfazer outras alterações?
ponto de bônus: Além disso, e se a alteração que eu quiser descartar estiver adicionando um arquivo? Eu gostaria de saber como desfazer essa mudança também.
git
git-checkout
lurscher
fonte
fonte
Respostas:
Supondo que você queira desfazer os efeitos
git rm <file>
ou serrm <file>
seguido porgit add -A
algo semelhante:Para desfazer
git add <file>
, a primeira linha acima é suficiente, supondo que você ainda não tenha confirmado.fonte
--
é a chave.git reset <file>
não funciona, e foi isso que me trouxe aqui.end-of-options-marker
necessário apenas no caso de arquivo excluído?git reset HEAD <file>
, o que é equivalente), masgit reset
trata seu primeiro argumento antesend-of-options-marker
como um nome ref, não como um nome de arquivo. Poderia ser escrito um pouco mais flexível? Provavelmente. Por que não foi? Provavelmente apenas os desenvolvedores sabem ao certo.git reset filename
funciona bem para arquivos não excluídos.git reset <file>
egit reset -- <file>
. Estou com dificuldade para encontrar uma resposta para isso no google.Ambas as perguntas são respondidas em
git status
.Para desestabilizar a adição de um novo arquivo, use
git rm --cached filename.ext
Para desfazer a exclusão de um arquivo, use
git reset HEAD filename.ext
Por outro lado,
git checkout --
nunca no palco, apenas descarta as alterações que não estão em etapas.fonte
git status
citado; mostra aos usuários uma maneira de auto-ajuda agora e na próxima vez, e caso as informações sejam adicionadas ou atualizadas em versões futuras do git.git reset
.Após ogit reset
, você verá "Alterado, mas não atualizado", o que significa "Alterações não testadas" no idioma nativo dos autores do git, aparentemente. Mais importante, todo o dogma sobre "o status git diz tudo o que você sabe" é uma mentira. (Gerentes que dizem que está desperdiçando o tempo das pessoas e deve ser demitido.)As respostas para suas duas perguntas estão relacionadas. Vou começar com o segundo:
Depois de preparar um arquivo (geralmente com
git add
, embora alguns outros comandos também incluam implicitamente as alteraçõesgit rm
), você pode fazer o backup dessa alteraçãogit reset -- <file>
.No seu caso, você deve ter utilizado
git rm
para remover o arquivo, o que equivale a simplesmente removê-lorm
e, em seguida, organizar essa alteração. Se você o desestabilizar primeiro,git reset -- <file>
poderá recuperá-logit checkout -- <file>
.fonte
Se ele foi preparado e confirmado, o seguinte redefinirá o arquivo:
Isso funcionará para uma exclusão que ocorreu várias confirmações anteriores.
fonte
git revert COMMIT_HASH
No git v2.23 , você tem outra opção:
git restore --staged -- <file>
fonte