Git Pull no es posible, archivos no fusionados

89

He leído todas las preguntas similares sobre esto; parece que ninguno de los siguientes ha funcionado:

Delete offending files
git reset --hard HEAD
git stash
git pull

Casi todas las combinaciones, el almacenamiento de cambios y la extracción del repositorio, dan como resultado archivos que no se pueden fusionar. Me gustaría descartar todos los cambios locales y simplemente usar el control remoto, pero no puedo clonar nuevamente (limitaciones de ancho de banda y uso de Internet con el desarrollador tratando de hacer esto). ¿Cómo hago esto?

Acabo de tratar:

git stash
git pull

Tampoco funcionó.

Más información

Hay un compromiso local y el upstream también tiene un compromiso. Por lo tanto, lo he intentado, git pull --rebasepero todavía no funciona correctamente ... Eso me da errores: "salir debido a un conflicto no resuelto". Si lo hago git stash, git reset --hard HEAD, git pull --rebase, aparece el error "No es posible extraer, cambios no fusionados ..."

Christian Stewart
fuente

Respuestas:

199

Digamos que el control remoto es originy la rama es master, y digamos que ya se ha mastercerrado, podría intentar lo siguiente:

git fetch origin
git reset --hard origin/master

Básicamente, esto solo toma la rama actual y la apunta a la HEADrama remota.

ADVERTENCIA : Como se indica en los comentarios, esto eliminará sus cambios locales y sobrescribirá con lo que sea que esté en el origen .

O puede usar los comandos de plomería para hacer esencialmente lo mismo:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

EDITAR: Me gustaría explicar brevemente por qué funciona esto.

los .git carpeta puede contener las confirmaciones de cualquier número de repositorios. Dado que el hash de confirmación es en realidad un método de verificación del contenido de la confirmación, y no solo un valor generado aleatoriamente, se utiliza para hacer coincidir los conjuntos de confirmación entre repositorios.

Una rama es solo un puntero con nombre a un hash dado. Aquí hay un conjunto de ejemplos:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Cada uno de estos archivos contiene un hash que apunta a una confirmación:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Estos son todos para el mecanismo de almacenamiento interno de git y funcionan independientemente del directorio de trabajo . Haciendo lo siguiente:

git reset --hard origin/master

git apuntará a la rama actual al mismo valor hash al que apunta el origen / maestro. Luego cambia con fuerza el directorio de trabajo para que coincida con la estructura / contenido del archivo en ese hash.

Para ver esto en funcionamiento, siga adelante y pruebe lo siguiente:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD
Trevor Norris
fuente
2
De la edición aprobada recientemente que agrega la advertencia masiva al principio, solo quisiera señalar que ya se mencionó: "Entonces [git] cambia a la fuerza el directorio de trabajo para que coincida con la estructura / contenido del archivo en ese hash". Pero supongo que eso no fue lo suficientemente explícito.
Trevor Norris
5

Resuelto, usando el siguiente conjunto de comandos:

git reset --hard
git pull --rebase
git rebase --skip
git pull

El truco consiste en reajustar los cambios ... Tuvimos algunos problemas para reajustar una confirmación trivial, por lo que simplemente la omitimos usando git rebase --skip (después de haber copiado los archivos).

Christian Stewart
fuente
3

Si alguna vez tiene este problema después de ejecutar un git fetchy luego git no le permite ejecutar git pulldebido a un conflicto de fusión ( ambos archivos modificados / no fusionados , y para frustrarlo más, no le mostrará ningún marcador de conflicto en el archivo ya que aún no está combinado). Si no desea perder su trabajo, puede hacer lo siguiente.

preparar el archivo.

$ git add filename

luego esconde los cambios locales.

$ git stash

extraer y actualizar su directorio de trabajo

$ git pull

restaure su archivo local modificado (git se fusionará automáticamente si puede, de lo contrario, resuélvalo)

$ git stash pop

Espero que te ayude.

Nimeshka Srimal
fuente
2

Existe una solución incluso si no desea eliminar sus cambios locales. Simplemente arregle los archivos no fusionados (por git addo git remove). Entonces hazlo git pull.

Preeti A.
fuente
1

Suponiendo que desea deshacerse de los cambios que tenga, primero verifique el resultado de git status. Para cualquier archivo que diga "no combinado" junto a él, ejecute git add <unmerged file>. Luego sigue con git reset --hard. Eso eliminará cualquier cambio local, excepto los archivos sin seguimiento.

Ryan Stewart
fuente
Correcto. Puede que no diga "sin fusionar". También podría decir "ambos modificados" o tal vez una o dos cosas más. ¿Cuál es la salida de git status?
Ryan Stewart
Después de publicar esto, le digo al miembro del equipo que lo intente git rebase --aborty git pull --rebasesegún la sugerencia de git
Christian Stewart
1

Me resolví con git eliminar el archivo no combinado localmente.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Cuando envío git commit después:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Chetabahana
fuente
0

La respuesta de Ryan Stewart casi estaba ahí. En el caso de que realmente no desee eliminar sus cambios locales, hay un flujo de trabajo que puede usar para fusionar:

  • correr git status . Le dará una lista de archivos no fusionados.
  • Fusionarlos (a mano, etc.)
  • correr git commit

Git confirmará solo las fusiones en una nueva confirmación. (En mi caso, tenía archivos agregados adicionales en el disco, que no se agruparon en esa confirmación).

Luego, Git considera que la fusión fue exitosa y le permite seguir adelante.

nightblade9
fuente