2012-01-03 16 views
37

Tengo dos sucursales localmente, master y Berislav. Este último está actualmente activo, y he cometido todos los cambios. Cuando intento por caja para master, me sale el siguiente mensaje:Git me pide que confirme o oculte los cambios en el maestro de pago, aunque se hayan realizado todos los cambios.

error: Your local changes to the following files would be overwritten by checkout: [list of files changed in the active branch] Please, commit your changes or stash them before you can switch branches. Aborting

Sin embargo, todo lo demás que probamos - commit, status, merge - me dice que no hay nada para cometer (directorio de trabajo limpio). ¿Qué debo hacer para llegar a mi sucursal master?

EDIT: Cuando intento git stash, estoy recibiendo:

error: feeding unmodified [file path] to diffcore

para todos los archivos que aparecen en el error anterior.

+0

http://stackoverflow.com/questions/6337122/git-branches-behaving-strangely y http: // stackoverflow.com/questions/6638937/switching-branches-in-git-when-will-i-get-you-have-local-changes-cannot-switc las respuestas pueden ayudar, con http://stackoverflow.com/questions/ 7463392/switching-a-branch-after-aborting-current-changes-in-git como posibles alternativas – VonC

+6

¿Cuál es la salida de 'git status'? – manojlds

+0

+1 a manojlds. Esa es información útil para resolver este problema. –

Respuesta

41

Encontré un problema similar hoy. git status no estaba enumerando los archivos de los que se quejaba el proceso de pago. Hice un:

git checkout -- path/to/file 

Y eso deshace cualquier cambio en el archivo.

Una forma aún más fácil de deshacer todos los cambios unstaged en el directorio de trabajo actual [1]:

git checkout -- . 

[1] - Ten cuidado - se perderá cualquier otro cambio unstaged que estaba trabajando (Si alguna). Si usted no sabe lo que está haciendo, a continuación, mantener una copia de seguridad de los archivos que estaba trabajando :)

+0

Esto me ayudó mucho. '' 'git checkout -f branch''' no funcionaba, pero fue suficiente. – rurp

+0

Esto a veces no ayuda. En un caso real, las terminaciones de línea de un archivo cambiaron de CRLF a LF, .gitattributes contiene '* .sh text eol = lf' pero' git checkout - .' no los reemplazó por la nueva versión sin CR –

1

Parece que tiene archivos sin seguimiento en su copia de trabajo, que se rastrean en la otra rama. Git se niega a realizar el pago en la otra sucursal, ya que los archivos locales que no se han registrado se sobrescribirán con los de la otra sucursal.

Puede ahora

  • agregar esos archivos a su rama actual, si dichos archivos son relevantes para esta rama
  • eliminar esos archivos si no se necesitan
+0

Otra opción sería usar 'git stash' para guardar los archivos en el alijo y restaurarlos en algún momento en el futuro (' git stash pop') – Grizzly

+0

El problema es que los archivos listados son rastreados, y la rama actual es informado como actualizado. El problema aparece solo cuando intentas pagar Master. –

+0

@BerislavLopac ¿Tiene filtros de borrado/limpieza en su repositorio (http://progit.org/book/ch7-2.html)? O una configuración de reemplazo de crlf activa (http://stackoverflow.com/a/2825829/311635)? – Rudi

10

Mueva el archivo infractor a alguna otra ubicación. A continuación, elimine el archivo ofensivo de su árbol. Tirar de nuevo luego difiera los cambios de su archivo ofensivo sobre el archivo que acaba de extraer. piratear, pero funciona

+0

Esto resolvió el problema para mí. ¡Gracias! – Kirill

+1

Esta fue la única solución que funcionó –

+3

Son cosas como esta que hacen que git gane su reputación por ser difícil de usar. –

39

Tan simple como esto:

git stash 
git stash pop 

Los "errores" que se ve cuando se ejecuta git stash aren hay algo de lo que preocuparse. Es solo que reconoce que el archivo no tiene ningún cambio no confirmado.

+0

Gracias, esto hizo el truco. – nerdoc

1

Muy similar a @JohnHammink respuesta, pero aquí va.

Solución

  1. archivo de trasladarse a otro directorio.
  2. Confirme sus cambios (podría mostrar que acaba de eliminar dos archivos).
  3. Agregue el archivo nuevamente al directorio.
  4. Confirmar (debe poder ver solo un archivo comprometido).

En mi caso, esto se debió a un archivo que se renombró con solo un cambio en el caso. p.ej. fooViewModel a FooViewModel. Git siguió pensando que el mismo archivo era en realidad dos archivos separados.

Creo que esto tiene algo que ver con que Unix sea sensible a las mayúsculas y minúsculas, mientras que las ventanas no lo son realmente.

espero que esto ayude

+0

Moví el archivo a otra ubicación y pude cambiar las ramas. –

12

tuve un problema similar en un clon fresco. Acabo forzado la caja con el --force (f) la bandera

git checkout --force some_branch 

Probablemente no es la mejor manera de resolver el problema en un repositorio en la que está haciendo cambios, pero en mi caso yo estaba seguro no me había No hizo ningún cambio, y solo quería cambiar de rama.

+1

Esta es la única respuesta que funcionó para mí. –

+0

lo mismo para mí. Intenté con todas las opciones pero esta funciona bien, gracias @Adam Bowen –

0

que tenían el mismo problema, y ​​esto resuelto mis problemas (en Linux):

git config --global core.autocrlf input 
Cuestiones relacionadas