Git: no se pueden deshacer los cambios locales (error: ruta ... no está fusionada)

338

Tengo el siguiente estado de árbol de trabajo

$ 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")

El archivo foo/bar.txtestá allí y quiero volver al estado "sin cambios" (similar a '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

Ahora se está volviendo 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
#

¿El mismo archivo en ambas secciones, nuevo y modificado? ¿Qué tengo que hacer?

mklhmnn
fuente
77
Desearía que alguien pudiera explicar cómo entramos en esta situación, por qué sucede y por qué funciona la solución.
Marcos Dione
1
Me metí en esta situación cuando saqué mi alijo después de un rebase que me metió en un conflicto de fusión (alijo pop hace una fusión) ... Para resolverlo, hice un "pago - el suyo" ... aparentemente mi los cambios todavía estaban allí ... para eliminarlos ... Intenté volver a pagar en el archivo ... ahí fue cuando vi el error anterior.
Arindam Roychowdhury

Respuestas:

558

Lo hiciste al revés. Primero debe restablecer, desestabilizar el archivo, luego finalizar la compra, para revertir los cambios locales.

Prueba esto:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt
Igor Zevaka
fuente
Gracias; ¡trabajado como un encanto! Tuve que comprometerme ( no con el argumento -a, los cambios relevantes ya estaban organizados) y luego pude empujar / tirar como de costumbre.
Patrick
18
Para mí requirió un: <br/> $ git reset - foo / bar.txt <br/> $ git checkout - foo / bar.txt <br/> (Observe el "-" extra en el medio)
Jan
44
La buena sintaxis es "git reset HEAD file1 file2 ..." luego "git checkout - file1 file2 ..."
Thomas Decaux
1
Siempre es divertido cuando la respuesta más votada básicamente dice "lo estás haciendo mal" :)
nathanchere
44
Una explicación (sobre qué hacen las cosas) hubiera sido genial ...
Kissaki
52

Esto funcionó perfectamente para mí:

$ git reset -- foo/bar.txt
$ git checkout foo/bar.txt
Steffi
fuente
14
git checkout origin/[branch] .
git status

// Nota el punto (.) Al final. Y todo estará bien

Joe Hyde
fuente
-2
git checkout foo/bar.txt

intentaste eso? (sin una palabra clave HEAD)

Por lo general, revierto mis cambios de esta manera.

zed_0xff
fuente
1
Error típico al intentar un checkouten medio de una fusión: $ git co path/to/file= resultado => error: path 'path/to/file' is unmerged => entonces, primero ejecute:, $ git reset path/to/filey luego git checkout path/to/filedebería funcionar.
Michael
2
No especificar HEAD hará que git checkout salga del índice, que es una operación más débil (la fuente de contenido es el índice en lugar de HEAD). Además, no creo que eso haga ninguna diferencia en este caso, con el problema específico que plantea la pregunta. Qué se intenta que?
Kissaki el
-4

Me parece que git stash es muy útil para el manejo temporal de todos los estados 'sucios'.

tomashin
fuente
44
Si lo encuentra útil, explique cómo ayudaría en este caso concreto. ¿Cómo lo usarías aquí?
Kissaki el