Adicionei acidentalmente muitos arquivos temporários usando git add -A
Consegui desestabilizar os arquivos usando os seguintes comandos e consegui remover o índice sujo.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Os comandos acima estão listados no git help rm
. Mas, infelizmente, meus arquivos também foram excluídos na execução, apesar de eu ter dado a opção de cache. Como posso limpar o índice sem perder o conteúdo?
Também seria útil se alguém pudesse explicar como essa operação de tubo funciona.
git
version-control
sarat
fonte
fonte
rm -f
não é um comando git e não tem uma--cached
opção. Seus arquivos locais foram excluídos antes da execução,git rm
portanto, acho que você não pode legitimamente culpargit rm
nada.git reset --hard
é a resposta correta e, de fato, excluirá o conteúdo. Isso vai confundir os usuários - como eu.Respostas:
git reset
Se tudo o que você deseja é desfazer uma execução "git add" excessivamente zelosa:
Suas alterações ficarão sem estágio e prontas para você adicionar novamente como desejar.
NÃO FUNCIONE
git reset --hard
.Ele não apenas desestabiliza os arquivos adicionados, mas também reverte todas as alterações feitas no diretório de trabalho. Se você criou novos arquivos no diretório de trabalho, ele não os excluirá.
fonte
git checkout -- *
tambémSe você tem um repo intocado (ou HEAD não está definido) [1], você pode simplesmente
Claro, isso vai exigir que você adicionar novamente os arquivos que você tinha quer ser adicionado.
[1] Observe (como explicado nos comentários) isso geralmente aconteceria apenas quando o repositório fosse novo em folha ("intocado") ou se nenhum comprometimento tivesse sido feito. Mais tecnicamente, sempre que não houver checkout ou árvore de trabalho.
Apenas deixando mais claro :)
fonte
Use
git reset HEAD
para redefinir o índice sem remover arquivos. (Se você deseja redefinir apenas um arquivo específico no índice, podegit reset HEAD -- /path/to/file
fazê-lo.)O operador do tubo, em uma concha, pega o
stdout
processo à esquerda e passastdin
o processo à direita. É essencialmente o equivalente a:mas, em vez disso
$ proc1 | proc2
, o segundo processo pode começar a obter dados antes que o primeiro seja finalizado, e não há nenhum arquivo real envolvido.fonte
git reset HEAD
sem especificar mais nada e ele redefinirá todo o índice. Você pode apenas adicionar novamente apenas os arquivos que deseja.$ git reset HEAD fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
git reset
então, sem oHEAD
.$ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
fonte
Se HEAD não estiver definido (ou seja, você ainda não tem confirmações, mas não quer se surpreender
.git
porque já definiu outra configuração de repo que deseja manter), você também podedesestabilizar tudo. Isso é efetivamente o mesmo que a solução da sehe, mas evita mexer com os internos do Git.
fonte
.git
porque definiu outra configuração de repositório quer manter. Eu editei para esclarecer isso.Aviso: não use o seguinte comando, a menos que queira perder trabalho não confirmado!
O uso
git reset
foi explicado, mas você também pediu uma explicação dos comandos canalizados, então aqui vai:O comando
git ls-files
lista todos os arquivos que o git conhece. A opção-z
impõe um formato específico a eles, o formato esperado porxargs -0
, que depois os chamarm -f
, o que significa removê-los sem verificar sua aprovação.Em outras palavras, "liste todos os arquivos que o git conhece e remova sua cópia local".
Em seguida, chegamos a
git diff
, que mostra as alterações entre as diferentes versões dos itens que o git conhece. Essas podem ser alterações entre diferentes árvores, diferenças entre cópias locais e cópias remotas, etc.Conforme usado aqui, ele mostra as alterações não-estágios; os arquivos que você alterou, mas ainda não confirmou. A opção
--name-only
significa que você deseja apenas os nomes dos arquivos (completos) e--diff-filter=D
significa que está interessado apenas nos arquivos excluídos. (Ei, não acabamos de excluir várias coisas?) Isso é canalizado para oxargs -0
que vimos antes, o que os invocagit rm --cached
, o que significa que eles são removidos do cache, enquanto a árvore de trabalho deve ser deixada em paz - exceto que você acabou de remover todos os arquivos da sua árvore de trabalho. Agora eles também são removidos do seu índice.Em outras palavras, todas as alterações, preparadas ou não, desapareceram e sua árvore de trabalho está vazia. Grite, faça o check-out de seus arquivos originais ou remotos e refaça seu trabalho. Amaldiçoe o sádico que escreveu essas linhas infernais; Não tenho a menor idéia de por que alguém iria querer fazer isso.
TL; DR: você acabou de lavar tudo; começar de novo e usar a
git reset
partir de agora.fonte
Receio que a primeira dessas linhas de comando exclua incondicionalmente da cópia de trabalho todos os arquivos que estão na área de preparação do git. O segundo desempenhou todos os arquivos rastreados, mas que foram excluídos. Infelizmente, isso significa que você terá perdido quaisquer modificações não confirmadas nesses arquivos.
Se você deseja obter sua cópia de trabalho e indexar como estavam na última confirmação , você pode (com cuidado ) usar o seguinte comando:
Digo "com cuidado", pois
git reset --hard
eliminará alterações não confirmadas na sua cópia de trabalho e índice. No entanto, nessa situação, parece que você deseja apenas retornar ao estado no seu último commit, e as alterações não confirmadas foram perdidas de qualquer maneira.Atualização: parece que, pelos seus comentários sobre a resposta de Amber, você ainda não criou nenhum commit (já que HEAD não pode ser resolvido), então isso não vai ajudar, receio.
Quanto à forma como esses canais funcionam:
git ls-files -z
egit diff --name-only --diff-filter=D -z
ambos exibem uma lista de nomes de arquivos separados pelo byte0
. (Isso é útil, pois, diferentemente das novas linhas,0
é garantido que os bytes não ocorram nos nomes dos arquivos nos sistemas semelhantes ao Unix.) O programaxargs
basicamente constrói linhas de comando a partir de sua entrada padrão, por padrão, obtendo linhas da entrada padrão e adicionando-as ao final da linha de comando. A-0
opção diz esperar que a entrada padrão seja separada por0
bytes.xargs
pode chamar o comando várias vezes para usar todos os parâmetros da entrada padrão, certificando-se de que a linha de comando nunca fique muito longa.Como um exemplo simples, se você tiver um arquivo chamado
test.txt
, com o seguinte conteúdo:... então o comando
xargs echo whatever < test.txt
chamará o comando:fonte
Se você deseja desfazer todas as alterações, use o comando abaixo,
No caso de você desejar desestabilizar as alterações e revertê-las do diretório de trabalho,
fonte