Git: não é possível desfazer alterações locais (erro: caminho… está imerso)


335

Eu tenho o seguinte estado da árvore de trabalho

$ git status foo/bar.txt
# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       deleted by us:      foo/bar.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

O arquivo foo/bar.txtestá lá e quero levá-lo ao "estado inalterado" novamente (semelhante ao 'svn revert'):

$ git checkout HEAD foo/bar.txt
error: path 'foo/bar.txt' is unmerged
$ git reset HEAD foo/bar.txt
Unstaged changes after reset:
M       foo/bar.txt

Agora está ficando confuso:

$ git status foo/bar.txt
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo/bar.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo/bar.txt
#

O mesmo arquivo nas duas seções, novo e modificado? O que devo fazer?


7
Eu gostaria que alguém pudesse explicar como entramos nessa situação, por que isso acontece e por que a solução funciona.
Marcos Dione

11
Entrei nessa situação quando estalei meu stash após uma reorganização que me levou a um conflito de mesclagem (stash pop faz uma mesclagem) .... Para resolvê-lo, fiz um "checkout - deles" .... aparentemente meu as alterações ainda estavam lá .... para removê-las ... tentei fazer um checkout no arquivo novamente ... foi quando vi o erro acima.
Arindam Roychowdhury

Respostas:


554

Você fez o caminho errado. Você deve redefinir primeiro, desestabilizar o arquivo e, em seguida, finalizar a compra, para reverter as alterações locais.

Tente o seguinte:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt

Obrigado; funcionou como um encanto! Eu tive que confirmar ( não com o argumento -a, as alterações relevantes já foram encenadas) e, em seguida, fui capaz de pressionar / puxar normalmente.
Patrick

18
Para mim, era necessário: <br/> $ git reset - foo / bar.txt <br/> $ git checkout - foo / bar.txt <br/> (Observe o "-" extra)
Jan

4
A sintaxe é bom "git reset CABEÇA file1 file2 ..." e depois "git checkout - file2 file1 ..."
Thomas Decaux

11
É sempre divertido quando o mais votado resposta basicamente apenas diz "você está fazendo errado" :)
nathanchere

4
Uma explicação (em Que coisas) teria sido ótimo ...
Kissaki

51

Isso funcionou perfeitamente para mim:

$ git reset -- foo/bar.txt
$ git checkout foo/bar.txt

14
git checkout origin/[branch] .
git status

// Anote o ponto (.) No final. E tudo vai ficar bem


-2
git checkout foo/bar.txt

você tentou isso? (sem uma palavra-chave HEAD)

Normalmente, reverto minhas alterações dessa maneira.


11
Erro típico ao tentar um checkoutno meio de uma mesclagem: $ git co path/to/file= result => error: path 'path/to/file' is unmerged => então, primeiro execute: $ git reset path/to/filee, em seguida, o git checkout path/to/filedeve funcionar.
22613 Michael

2
Não especificar o HEAD fará o check-out do git no índice, que é uma operação mais fraca (a fonte de conteúdo é o índice e não o HEAD). Além disso, não acho que isso faça alguma diferença nesse caso - com o problema específico que a pergunta afirmou. Será que você tentar isso?
Kissaki 23/11

-4

Acho o git stash muito útil para o manuseio temporal de todos os estados 'sujos'.


4
Se você achar útil, explique como isso ajudaria nesse caso concreto. Como você o usaria aqui?
Kissaki 23/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.