2011-06-27 15 views
10

Hice un git pull desde mi upstream en un directorio de trabajo limpio y me presenta conflictos de combinación. Pasé aproximadamente una hora reconfigurándolos manualmente pensando que había estropeado algo y sucedió de nuevo.git pull del directorio limpio tiene conflictos de combinación

¿Esto es un error en git? Sé muy poco al respecto, así que estoy completamente dispuesto a aceptar que me hice esto.

Aquí está mi salida truncada (que pasa a unos 9 archivos pero quería ahorrar espacio, y los nombres de archivos han sido cambiados para proteger a los inocentes):

$ git status 
# On branch master 
nothing to commit (working directory clean) 
$ git pull 
Auto-merged xxxx/xxxx/xxxx.xxx 
CONFLICT (content): Merge conflict in xxxx/xxxx/xxxx.xxx 
Automatic merge failed; fix conflicts and then commit the result. 

estoy usando Solaris 11 Express con el paquete predeterminado git.

$ uname -a 
SunOS xxxx 5.11 snv_151a i86pc i386 i86pc Solaris 
$ git --version 
git version 1.5.6.5 
$ pkg list git 
NAME (PUBLISHER)        VERSION   STATE  UFOXI 
developer/versioning/git      1.5.6.5-0.151.0.1 installed ----- 

me encontré con esta pregunta: Git pull fails: You have unstaged changes. Git status: nothing to commit (working directory clean), que parece más cercano, pero tiene una respuesta poco satisfactoria.

¿Cómo puedo superar esto sin borrar todo mi repositorio y hacer un nuevo clon?

Respuesta

15

Su directorio de trabajo puede estar limpio, pero tiene una o más confirmaciones que ha realizado localmente que no están en el servidor. Cuando tira, git intenta combinar estas confirmaciones locales con las del servidor, pero como modifican la misma área del código, entran en conflicto.

Sus opciones aquí básicamente se reducen a:

  1. Fix the conflicts. te dicen git cómo manejar los cambios conflictivos, y seguir adelante.
  2. Rebase y solucione los conflictos, con git pull --rebase. Esto no es muy diferente de 1, pero si sus cambios nunca se han publicado (es decir, nunca se han enviado), esto puede brindarle un historial más limpio (lineal).
  3. Descarta los cambios locales y utiliza el control remoto, con git reset --hard remotename/remotebranch. Esto perderá cualquier cambio que haya cometido localmente, pero que no se haya enviado a otra parte.
+1

No tengo ningún compromiso local en esa rama, pero el n. ° 3 lo hizo, gracias. – bahamat

+4

Respuesta útil, me ayudó a encontrar la manera de salir de las malas hierbas. En mi caso, había ejecutado un 'maestro de git rebase' en una sucursal. Luego tuve un conflicto de fusión como se describe arriba. Resuelto con 'git merge --abort' y luego su 'git pull --rebase'. ¡Gracias! – wndxlori

0

Tirar, resolver los conflictos de combinación y confirmar? Incluso si tiene un directorio de trabajo limpio, si ha cometido algún trabajo, que está en conflicto con los cambios entrantes, se obtiene un conflicto de fusión.

0

Agregando a bdonlan respuesta, que puede ocurrir cuando usted tiene algunas confirmaciones (en su repositorio local), pero el repositorio remoto está por delante (tenido algún progreso en comparación con sus archivos comprometidos locales).

Me quedé atascado cuando no pude empujar ni tirar debido a esos conflictos.

tratado de hacer 'rebase' o 'reinicio --hard' sin suerte.

La única solución que funcionó para mí fue retroceder un compromiso y tirar;

seguir los siguientes pasos:

Advertencia: esta es una operación destructiva que le hará perder los últimos cambios a este código, por lo que los cambios de copia de seguridad primero!

  1. Uso 'git log ' en su repositorio local y comparar esto con las confirmaciones de registro en el mando a distancia - para entender lo que uno de sus confirmaciones no fue empujado
  2. Uso 'git reset --hard 'para volver a la última vez que el código de ajuste al repositorio remoto (I utiliza' git reset CABEZA --hard^ que perder deliberadamente mi confirmación anterior)
  3. Ahora 'git pull' va a funcionar; úselo para obtener el último código del servidor remoto