¿Cómo ignoro un error en 'git pull' sobre que mis cambios locales serían sobrescritos por la fusión?


569

¿Cómo ignoro el siguiente mensaje de error en Git pull?

Los cambios locales en los siguientes archivos se sobrescribirán mediante fusión

¿Qué pasa si quiero sobrescribirlos?

He intentado cosas como git pull -f, pero nada funciona.

Para ser claros, solo quiero sobrescribir cambios específicos, no todo.


Relacionados pero no duplicados: stackoverflow.com/questions/52704/…
Daniel Hilgarth

77
@BrianKnoblauch totalmente de acuerdo! Además, no es una gran "fusión" si se "sobrescribe", ¿verdad? Echo de menos SVN todos los días ...
user1944491

2
git config core.fileMode falsesalva mis tiempos
Nolwennig 03 de


¿Qué pasa si no quiero sobrescribirlos?
Philip Rego

Respuestas:


439

Si desea eliminar todos los cambios locales, incluidos los archivos que git no rastrea, de su copia de trabajo, simplemente guárdelos:

git stash push --include-untracked

Si ya no los necesita, ahora puede soltar ese alijo:

git stash drop

Si no desea guardar los cambios que ya organizó, por ejemplo, con git add, agregue la opción --keep-index. Sin embargo, tenga en cuenta que esto aún evitará la fusión si esos cambios en escena chocan con los de arriba.


Si desea sobrescribir solo partes específicas de sus cambios locales, hay dos posibilidades:

  1. Confirma todo lo que no quieras sobrescribir y utiliza el método anterior para el resto.

  2. Úselo git checkout path/to/file/to/revertpara los cambios que desea sobrescribir. Asegúrese de que el archivo no se organice por medio de git reset HEAD path/to/file/to/revert.


Posibilidad # 2 no funciona. Después de ejecutar el comando no pasa nada. En el tirón sigo teniendo el mismo error.
mae

1
@ user1132363: funciona para mí. Por favor, pruébelo primero con un solo archivo. Además, debe asegurarse de que el archivo que desea sobrescribir no esté preparado.
Daniel Hilgarth

3
El truco era usarlo git checkout HEAD^ path/to/file/to/revert. Usando HEAD ^ hizo toda la diferencia.
mae

2
@ user1132363: Eso comprueba la versión anterior y no la que está actualmente registrada. No creo que este sea el enfoque correcto.
Daniel Hilgarth

1
Tuve que dejar de lado " save --keep-index".
Peter Mortensen

318

Bien, con la ayuda de las otras dos respuestas, he encontrado una solución directa:

git checkout HEAD^ file/to/overwrite
git pull

77
Esto funcionó para mí. ¿Podría ampliar esta respuesta, es decir. ¿Qué está haciendo esto realmente?
AC Patrice

3
Está dejando caer los cambios locales, volviendo a la referencia HEAD que probablemente sea la última confirmación en la rama maestra
k3a

32
¿Por qué HEAD ^ en lugar de HEAD?
Yura

19
HEAD ^ es la abreviatura de HEAD ^ 1, que esencialmente significa el commit antes de HEAD. También puede hacer HEAD ^ 2 para el commit antes de ese. Para obtener más información, consulte git-scm.com/book/en/v2/… y stackoverflow.com/questions/1955985/… .
davidneedham

44
explique qué hace esto en la respuesta
endolito

242

Esto funciona para mí para anular todos los cambios locales y no requiere una identidad:

git reset --hard
git pull

44
SO necesita trabajar en su clasificación, algo engorroso para encontrar una respuesta funcional y altamente calificada hasta el momento.
Benedict K.

3
@BenedictK. Creo que el sistema de clasificación refleja adecuadamente "lo que la mayoría de las personas encuentra más útil". Están clasificados por votos. Más personas prefieren las otras soluciones. Esta es una buena solución, pero a más personas las otras respuestas les resultan más útiles.
Kittsil

Funciona bien para mí
Ender

super fácil =) thx ^^
lestat_kim

tanques, funciona bien para mí
Igor

76

Aquí hay una solución que descarta los cambios por etapas:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Molesto, si la diferencia percibida proviene del hecho de que el archivo tenía sus nuevas líneas cambiadas cuando se desprotegió, esto no solucionará el problema.
DanielSank

1
Resuelto mi problema
Loïc N.

Esta es la mejor respuesta, en mi opinión, porque no interrumpe ningún elemento organizado, sino que aborda el problema del archivo que impide la extracción
theRiley

65

Puede confirmar sus cambios antes de fusionarlos o guardarlos:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
El punto es que no deberías tener que hacer esto. Solo toma el material HEAD actual y ... ¡combínalo! Es realmente simple, Git, todos los demás VCS lo hacen ... pero no. Linus tuvo que hacerlo molesto de usar.
Jon

@ Jon Esta solución es para Ubuntu, no he encontrado nada mejor que esto.
Suneel Kumar

Lamentablemente, la --autostashopción solo está disponible con la --rebaseopción (
Eugen Konkov

eso va a introducir tantos problemas que no vale la pena. Tarda 5 minutos al menos en cargar también. También presenta errores de "Desvincular archivo". voto negativo
Philip Rego

51

Si desea descartar sus cambios locales en un archivo, puede hacer lo siguiente:

git checkout -- <file>

Entonces podría sobrescribir el archivo [s] con la última versión simplemente haciendo:

git pull

@pabloasc Esto es destruir sus cambios locales en ese archivo.
Suneel Kumar

66
Sí, lo hace: "¿Qué pasa si quiero sobrescribirlos?"
David

1
La pregunta original no es capaz de esto, esta respuesta puede dar una pesadilla a alguien que puede copiar y pegar ciegamente el comando.
Suneel Kumar

En caso de que ya haya realizado una confirmación, primero debe revertir la confirmación a través de git reset HEAD~y luego hacer elgit checkout
dopexxx

git checkout -- <file>falla conerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Si su repositorio contiene algunos archivos que se eliminan de master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

A veces, ninguno de estos funciona. Molesto, debido a lo de LF, creo, lo que funcionará es eliminar los archivos y luego tirar. No es que recomiende esta solución, pero si el archivo no existe, git no le informará inútilmente que sus cambios (que pueden no ser cambios) se anularán y le permitirán continuar.

Úselo bajo su propio riesgo.


Cuando estás atascado debido a los finales de línea, este método es un salvavidas
Dan Pisarski

Esto no está funcionando para mí. Los archivos no existen localmente y todavía recibo el error.
PRMan

11

git stash save --keep-index no funcionó para mí

El siguiente comando funcionó como se esperaba.

git reset --hard
git pull

Anula todos los cambios locales si no los necesita.


10

Tantas respuestas aquí que odio agregar otra más, pero todas las anteriores son más complicadas de lo que deberían ser. Tengo que hacer esto todo el tiempo, ya que Git parece confundirse y dice que he modificado los archivos que no han cambiado (no se puede revertir porque no cambiaron, pero no puedo extraerlo porque supuestamente han cambiado). Lo más rápido que he encontrado hasta ahora es:

git stash
git stash drop
git pull

trabajó como un encanto
Blaze

¡Asombroso! Solución simple y de trabajo.
naïveRSA

genial, muchas gracias
Hamza

8

En el Git reciente, puede agregar -r/ activar --rebaseel pullcomando para volver a basar su rama actual en la parte superior de la rama ascendente después de la recuperación. La advertencia debería desaparecer, pero existe el riesgo de que surjan algunos conflictos que deberá resolver.


Alternativamente, puede pagar diferentes ramas con fuerza, luego volver a master, por ejemplo:

git checkout origin/master -f
git checkout master -f

Luego tire de nuevo como de costumbre:

git pull origin master

El uso de este método puede ahorrarle tiempo de almacenamiento ( git stash) y posibles problemas de permisos, restablecimiento de archivos ( git reset HEAD --hard), eliminación de archivos ( git clean -fd), etc. Además, lo anterior es más fácil de recordar.


8

Este problema se debe a que ha realizado cambios localmente en el / los archivo / s y existe el mismo archivo / s con cambios en el repositorio de Git, por lo que antes de extraer / insertar necesitará guardar los cambios locales:

Para sobrescribir cambios locales de un solo archivo:

git reset file/to/overwrite
git checkout file/to/overwrite

Para sobrescribir todos los cambios locales (cambios en todos los archivos):

git stash
git pull
git stash pop

Además, este problema puede deberse a que está en una rama que no está fusionada con la rama maestra.


5

git reset --hard && git clean -df

Precaución : esto restablecerá y eliminará los archivos no rastreados.


27
Uno no usa hacha para quitar la mosca de la frente de un amigo.
HonoredMule

3
NO use esto sin el conocimiento de que algunos archivos serán BORRADOS.
andromeda


4

La mejor manera de resolver este problema es:

git checkout -- <path/file_name>

Después de eso, puede sobrescribir el archivo:

git pull origin master

Tuve el problema mencionado porque había actualizado el índice para asumir que los archivos no habían cambiado. Todavía no me dejaba hacer el tirón. Usé git checkout -- path/*solo una vez, y me permitió ejecutar el pull después.
Stephen O'Flynn

4

Esto funcionó para mí para descartar cambios en el servidor remoto en vivo y extraer del control de origen GitHub:

git reset --hard
git pull origin master

4

Aquí está mi estrategia para resolver el problema.

Planteamiento del problema

Necesitamos hacer cambios en más de 10 archivos. Lo intentamos PULL (git pull origin master), pero Git gritó:

error: sus cambios locales en los siguientes archivos se sobrescribirán mediante fusión: por favor, confirme los cambios o guárdelos antes de poder fusionarlos.

Intentamos ejecutar commity luego pull, pero tampoco funcionaron.

Solución

En realidad, estábamos en la etapa sucia , porque los archivos estaban en el "Área de ensayo", también conocido como "Área de índice", y algunos estaban en el "Área de cabecera", también conocido como "directorio Git local". Y queríamos sacar los cambios del servidor.

Consulte este enlace para obtener información sobre las diferentes etapas de Git de manera clara: Etapas de GIT

Seguimos los siguientes pasos

  • git stash (esto limpió nuestro directorio de trabajo. Git almacena sus cambios en la pila).
  • git pull origin master (Extraiga los cambios del servidor)
  • git stash apply (Aplica todos los cambios de la pila)
  • git commit -m 'message' (Cometió los cambios)
  • git push origin master (Empujó los cambios al servidor)
  • git stash drop (Suelta la pila)

Comprendamos cuándo y por qué necesita esconderse

Si está en estado sucio , significa que está haciendo cambios en sus archivos y luego, por cualquier motivo, se ve obligado a retirar o cambiar a otra sucursal para realizar un trabajo muy urgente, por lo que en este momento no puede extraer o cambia hasta que confirmes tu cambio. El stashcomando está aquí como una mano amiga.

Del libro ProGIT , 2da Edición:

A menudo, cuando ha estado trabajando en parte de su proyecto, las cosas están en un estado desordenado y desea cambiar las ramas por un tiempo para trabajar en otra cosa. El problema es que no desea realizar una tarea de trabajo a medias para poder volver a este punto más adelante. La respuesta a este problema es el comando git stash. Stashing toma el estado sucio de su directorio de trabajo, es decir, sus archivos rastreados modificados y los cambios por etapas, y lo guarda en una pila de cambios sin terminar que puede volver a aplicar en cualquier momento.


3

Si desea sobrescribir cambios específicos, necesita alguna forma de decirle cuáles desea olvidar.

Puede intentar guardar selectivamente los cambios que desea abandonar usando git stash --patchy luego soltar ese alijo con git stash drop. A continuación, puede realizar los cambios remotos y fusionarlos de manera normal.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

No sé por qué esto aún no se responde, pero la solución, como puede ver, es simple. Todas las respuestas aquí sugieren lo mismo: para eliminar / guardar sus cambios locales y aplicarlos en sentido ascendente, luego (si lo hace save) aplique sus cambios locales en la parte superior.

Qué git pull --rebase --autostashhace paso a paso:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Mi caso (probablemente el tuyo también):

Tengo cambios locales (cambios en el directorio de trabajo):

ingrese la descripción de la imagen aquí

Cuando intento extraer cambios remotos, aparece un error:

ingrese la descripción de la imagen aquí

Estos cambios no se cruzan con los cambios locales:

ingrese la descripción de la imagen aquí

Entonces, cuando pull --rebase --autostashlos cambios locales se guardan y aplican sin ningún problema automáticamente

ingrese la descripción de la imagen aquí

Ahora mis cambios locales son un poco más bajos: ingrese la descripción de la imagen aquí


2

Tuve un caso especial de esto: tenía un archivo con --asumir- sin cambios en él. Fue difícil de localizar, ya que el git statuscomando no mostraba ningún cambio


Yo tengo este mismo problema. ¿Encontraste una manera de evitarlo? Supongo que podría eliminar y luego volver a agregar asumir sin cambios ... lo que hice fue verificar esos archivos manualmente para obtener versiones sin cambios ... solo me pregunto si hay una manera de hacer que la verificación / rebase / fusión simplemente sobrescriba ellos.
David

1
No, tuve que abandonar todo el asunto "asumir sin cambios".

2

Si desea mantener los cambios de producción en el servidor, simplemente fusione en un nuevo elemento de configuración. El método de procesamiento es el siguiente:

git stash
git pull
git stash pop

Quizás no ejecutes todas las operaciones. Puedes saber lo que puedes hacer a continuación.


A continuación, puede usar el nombre Git diff - w + del archivo para confirmar que el código se fusionará automáticamente
YanQing

1

Estaba ignorando un archivo en mi repositorio y cuando lo hice git pull upstream master, recibí el siguiente error:

error: sus cambios locales en los siguientes archivos se sobrescribirán con merge: myfile.js Por favor, confirme los cambios o guárdelos antes de poder fusionar. Abortar

Para resolverlo hice lo siguiente

git update-index --no-assume-unchanged myfile.js

Entonces lo hice git statusy recibí este mensaje

En la rama maestra Su rama está detrás de 'origen / maestro' por 4 confirmaciones, y se puede reenviar rápidamente. (use "git pull" para actualizar su sucursal local)

Cambios no organizados para commit: (use "git add ..." para actualizar lo que se confirmará) (use "git checkout - ..." para descartar cambios en el directorio de trabajo)

modificado: myfile.js

no se agregaron cambios al commit (use "git add" y / o "git commit -a")

Luego lo git checkout myfile.jsseguí git pull upstream master. Esta vez la operación git pull fue exitosa.


1

Encontré esto cuando tiraba del maestro.

La forma en que lo manejé, usando Visual Studio;

  1. Primero, realicé Deshacer confirmación en mi solución.
  2. Luego hice el proceso de extracción de Git.

¡Espero que esto ayude!



1

Soy nuevo en git y no estoy seguro de si mi solución es una buena idea.

¡He probado TODAS las respuestas y ninguna de ellas funcionó para mí!

Pero encontré otra solución:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Espero que esto ayude.


1

El error "Sus cambios locales en los siguientes archivos se sobrescribirán por fusión" se produce porque tiene algunos cambios en el repositorio local que NO se han confirmado todavía, por lo que antes de extraerlo del repositorio remoto, simplemente confirme los cambios en el repositorio local.

Digamos que su repositorio remoto tiene alguna rama xyz y desea que esa rama remota de repositorio xyz se fusione con (se copie) en la sucursal local de repositorio xyz, entonces,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Si este error se debe a finales de línea,

git add
git checkout mybranch

trabajará. No estoy realmente seguro de por qué funciona.



0

Este mensaje también puede aparecer si git-lfsse usa y un puntero de archivo fue sobrescrito por un archivo real.

entonces usas:

git stash
git lfs migrate import
git pull

salida completa de mi caso

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

ver https://github.com/git-lfs/git-lfs/issues/2839


0

Lo he intentado y con éxito, antes de tirar, permite confirmar todos los archivos que no has confirmado, entonces no recibirás esos mensajes de AS.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.