¿Por qué dice git "Pull no es posible porque tienes archivos no fusionados"?

195

Cuando intento acceder al directorio de mi proyecto en la terminal, veo el siguiente error:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

¿Por qué dice git "Pull is not possible because you have unmerged files"y cómo puedo resolverlo?

Harsukh Makwana
fuente
1
En mi caso, acabo de usar estos comandos "git add". luego "git commit -m" Test "y al final" git push ". Error eliminado
Akhzar Nazir
Simplemente necesitaba agregar "$ git add <file>" ... para actualizar lo que se confirmará o restaurará (para descartar cambios en el directorio de trabajo), luego confirme "$ git commit", luego "$ git push" para concluir la fusión.
find_X
En caso de que ayude: he notado que solo estoy haciendo "git add". entonces comprometerse no funcionó. Tuve que agregar el archivo individual por nombre, luego confirmar y tirar / empujar.
ouonomos

Respuestas:

212

Lo que está sucediendo actualmente es que tiene un cierto conjunto de archivos, que ha intentado fusionar anteriormente, pero que arrojaron conflictos de fusión. Idealmente, si uno tiene un conflicto de fusión, debería resolverlos manualmente y confirmar los cambios usando git add file.name && git commit -m "removed merge conflicts". Ahora, otro usuario ha actualizado los archivos en cuestión en su repositorio y ha llevado sus cambios al repositorio ascendente común.

Sucede que los conflictos de fusión de (probablemente) la última confirmación no se resolvieron, por lo que sus archivos no se fusionaron correctamente y, por lo tanto, el indicador U( unmerged) para los archivos. Entonces, cuando haces un git pull, git está arrojando el error, porque tienes alguna versión del archivo, que no se resuelve correctamente.

Para resolver esto, deberá resolver los conflictos de fusión en cuestión, y agregar y confirmar los cambios, antes de poder hacer una git pull.

Reproducción de muestra y resolución del problema:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Primero, creemos la estructura del repositorio

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Ahora estamos en repo_clone, y si haces un git pull, arrojará conflictos

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Si ignoramos los conflictos en el clon y hacemos más confirmaciones en el repositorio original ahora,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Y luego hacemos un git pull, obtenemos

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Tenga en cuenta que el fileahora está en un estado no combinado y si hacemos un git status, podemos ver claramente lo mismo:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Entonces, para resolver esto, primero tenemos que resolver el conflicto de fusión que ignoramos anteriormente

repo_clone $ vi file

y establece su contenido en

text2
text1
text1

y luego agregarlo y confirmar los cambios

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
mu 無
fuente
1
Para completar, agregaría la respuesta de @ Pawan para usar 'git mergetool' para resolver conflictos. El penúltimo paso puede no ser muy práctico ("resuelva la fusión ... [estableciendo] ... su contenido en: [algún texto]").
innegablemente,
Alternativamente, puede fusionarse utilizando los consejos de @ user261. De cualquier manera, creo que agregar un paso sobre cómo fusionarse en un sentido práctico completaría esta respuesta.
innegablemente,
3
Esta respuesta funciona muy bien cuando tiene conflictos simples para solucionar en archivos individuales. Por ejemplo, una o dos líneas de código que son diferentes. Si tiene varios archivos que se han modificado en gran medida, esta es una solución difícil. Pero lleva a casa la idea de que con Git debe comprometerse a menudo para evitar conflictos difíciles.
Vaughn D. Taylor
46

Está intentando agregar una nueva confirmación más a su sucursal local mientras su directorio de trabajo no está limpio. Como resultado, Git se niega a hacer el tirón. Considere los siguientes diagramas para visualizar mejor el escenario:

remoto: A <- B <- C <- D
local: A <- B *
(* indica que tiene varios archivos que han sido modificados pero no confirmados).

Hay dos opciones para lidiar con esta situación. Puede descartar los cambios en sus archivos o conservarlos.

Opción uno: Deseche los cambios
Puede usar git checkoutpara cada archivo no fusionado, o puede usar git reset --hard HEADpara restablecer todos los archivos de su rama a HEAD. Por cierto, HEAD en su sucursal local es B, sin un asterisco. Si elige esta opción, el diagrama se convierte en:

remoto: A <- B <- C <- D
local: A <- B

Ahora, cuando tire, puede avanzar rápidamente su rama con los cambios de maestro. Después de tirar, tu rama se vería como maestra:

local: A <- B <- C <- D

Opción dos: conservar los cambios
Si desea conservar los cambios, primero deberá resolver cualquier conflicto de fusión en cada uno de los archivos. Puede abrir cada archivo en su IDE y buscar los siguientes símbolos:

<<<<<<< HEAD
// su versión del código
=======
// la versión remota del código
>>>>>>>

Git te presenta dos versiones de código. El código contenido dentro de los marcadores HEAD es la versión de su sucursal local actual. La otra versión es lo que viene del control remoto. Una vez que haya elegido una versión del código (y haya eliminado el otro código junto con los marcadores), puede agregar cada archivo a su área de preparación escribiendo git add. El último paso es confirmar su resultado escribiendo git commit -m con un mensaje apropiado. En este punto, nuestro diagrama se ve así:

remoto: A <- B <- C <- D
local: A <- B <- C '

Aquí he etiquetado el commit que acabamos de hacer como C 'porque es diferente del commit C en el control remoto. Ahora, si intenta tirar, obtendrá un error de avance no rápido. Git no puede reproducir los cambios en el control remoto en su rama, ya que tanto su rama como el control remoto se han separado de la confirmación de antepasado común B. En este punto, si desea tirar, puede hacer otra git mergeo git rebasesu rama en el control remoto.

Obtener un dominio de Git requiere ser capaz de comprender y manipular listas vinculadas unidireccionales. Espero que esta explicación te haga pensar en la dirección correcta sobre el uso de Git.

Tim Biegeleisen
fuente
33

Hay una solución simple para ello. Pero para eso primero tendrás que aprender lo siguiente

vimdiff

Para eliminar los conflictos, puede usar

git mergetool

El comando anterior básicamente abre un archivo local, un archivo mixto, un archivo remoto (3 archivos en total) para cada archivo en conflicto. Los archivos locales y remotos son solo para su referencia, y al usarlos puede elegir qué incluir (o no) en el archivo mixto. Y solo guarde y salga del archivo.

Pawan Seerwani
fuente
2
Diría que vimdiff no es obligatorio (puede utilizar cualquier herramienta de combinación / diferencia que elija, como WinMerge o FileMerge incorporado de OSX, etc.). Dicho esto, esta es una gran adición a la respuesta de @ mu.
innegablemente,
32

Si no desea fusionar los cambios y aún desea actualizar su local, ejecute:

git reset --hard HEAD  

Esto restablecerá su local con HEAD y luego extraerá su control remoto usando git pull.

Si ya ha comprometido su fusión localmente (pero aún no ha presionado al control remoto) y desea revertirlo también:

git reset --hard HEAD~1 
Santosh
fuente
6

Si desea desplegar una rama remota para que se ejecute localmente (por ejemplo, para fines de revisión o prueba), y cuando $ git pullobtiene conflictos de fusión locales:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
usuario5245397
fuente
5

Tiene algunos archivos localmente que deben fusionarse antes de poder extraer. Puede retirar los archivos y luego tirar para sobrescribir sus archivos locales.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
Mella
fuente
La fusión combina el contenido de dos archivos. Actualmente, sus archivos locales difieren de los del servidor remoto. La fusión debe hacerse en el servidor remoto. Entonces, si coloca en escena sus archivos editados y los empuja, sus cambios se agregarán a los archivos en el repositorio. Luego, sus archivos estarán sincronizados y podrá extraer todo el proyecto con otros cambios. Encontré el libro de ayuda de git muy útil cuando comencé a usar git. Puede encontrarlo aquí: git-scm.com/book/en/Getting-Started
Nick
Tenga en cuenta que no soy el OP. "Fusionar archivos" es una terminología incorrecta. Estrictamente hablando, fusionas commits, no archivos.
jub0bs
Ah sí, eso es cierto, mis disculpas. Estaba tratando de dar una respuesta simple
Nick el
Bueno, si tiene conflictos al fusionar un commit, entonces sí, tendrá archivos conflictivos no fusionados y deberá fusionarlos.
Edward Thomson el
3

Pasos a seguir :

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Gracias Sarbasish

Sarbasish Mishra
fuente
2

Hubo el mismo problema conmigo
En mi caso, los pasos son los siguientes:

  1. Se eliminó todo el archivo que se iniciaba con el símbolo U (no combinado) . como-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Extraer código del maestro

$ git pull origin master
  1. Comprobado el estado

 $ git status

Aquí está el mensaje que apareció,
y tienen 2 y 1 confirmaciones diferentes cada uno, respectivamente. Tienes caminos no fusionados.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Rutas no fusionadas:
(use "git add ..." para marcar la resolución)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Se agregaron todos los cambios nuevos:

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Cometer cambios en la cabeza

$ git commit -am "resolved conflict of the app."
  1. Empujó el código

$ git push origin master

Qué turno puede resolver el problema con esta imagen: ingrese la descripción de la imagen aquí

S.Yadav
fuente
1

Cuando se produce un conflicto de fusión, puede abrir un archivo individual. Obtendrá los símbolos "<<<<<<< o >>>>>>>". Estos se refieren a sus cambios y los cambios presentes en el control remoto. Puede editar manualmente la parte que se requiere. después de eso guarde el archivo y luego haga: git add

Los conflictos de fusión se resolverán.

dfordevy
fuente
-1

Solo ejecuta este comando:

git reset --hard
Gracia verde
fuente
3
Debería explicar qué hace el comando, porque algunas personas se sentirán muy decepcionadas si intentan descubrir que eliminó todos sus cambios locales actuales: /
Joseph Budin
Esto funciona si solo copia sus cambios a una fuente temporal externa ... si solo tiene un par de archivos, por ejemplo, archivos de configuración para un proyecto, es perfecto. Ejecute el comando y luego revierta sus cambios. ¡Funciona para mi!
cwiggo