¿Cómo fuerzo a "git pull" a sobrescribir los archivos locales?

¿Cómo fuerzo una sobrescritura de archivos locales en un git pull?

El escenario es el siguiente:

  • Un miembro del equipo está modificando las plantillas de un sitio web en el que estamos trabajando.
  • Están agregando algunas imágenes al directorio de imágenes (pero se olvida de agregarlas bajo el control de fuente)
  • Me están enviando las imágenes por correo, más tarde, a mí.
  • Estoy agregando las imágenes bajo el control de fuente y las estoy enviando a GitHub junto con otros cambios
  • No pueden extraer actualizaciones de GitHub porque Git no quiere sobrescribir sus archivos.

Este es el error que obtengo:

error: el archivo de árbol de trabajo sin seguimiento 'public / images / icon.gif' se sobrescribirá mediante la combinación

¿Cómo obligo a Git a sobrescribirlos? La persona es un diseñador; por lo general, resuelvo todos los conflictos a mano, por lo que el servidor tiene la versión más reciente que solo necesita actualizar en su computadora.

preguntado el 14 de julio de 09 a las 11:07

cualquiera que lea esto y piense que podría perder archivos, he estado en esta posición y descubrí que el búfer de Sublime Text me ha salvado; si estoy trabajando en algo, borre todo accidentalmente tratando de resolver un problema similar a este o usando una respuesta a esta pregunta y he tenido los archivos abiertos en Sublime (lo cual hay muchas posibilidades de que ocurra), entonces los archivos seguirán allí, en Sublime, ya sea allí, o en el historial de deshacer -

git reset --hard origin/branch_to_overwrite -

Básicamente, solo haga una extracción desde el desarrollo después del pago inicial -b. haz tu trabajo, luego vuelve a entrar. -

Respuesta corta: elimine y vuelva a crear la rama. 1. Eliminar rama: git branch <branch> -D 2. Restablezca una confirmación antes del conflicto: git reset <commit> --hard 3. Vuelva a crear la rama: git branch <branch> 4. Establezca el seguimiento en el servidor: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git tirar` -

Para cambiar todas las terminaciones CRLF a LF, (comience a limpiar) git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout . -

30 Respuestas

⚠ Importante: si tiene cambios locales, se perderán. Con o sin --hard opción, se perderán todas las confirmaciones locales que no se hayan enviado.[*]

Si tiene archivos que no rastreados por Git (por ejemplo, contenido de usuario subido), estos archivos no se verán afectados.


Primero, ejecute una búsqueda para actualizar todos origin/<branch> referencias a la última:

git fetch --all

Haga una copia de seguridad de su sucursal actual:

git checkout -b backup-master

Entonces, tienes dos opciones:

git reset --hard origin/master

O si se encuentra en otra sucursal:

git reset --hard origin/<branch_name>

Explicación:

git fetch descarga lo último desde el control remoto sin intentar fusionar o reajustar nada.

Entonces el git reset restablece la rama maestra a lo que acaba de obtener. La --hard La opción cambia todos los archivos en su árbol de trabajo para que coincidan con los archivos en origin/master


Mantener las confirmaciones locales actuales

[*]: Vale la pena señalar que es posible mantener las confirmaciones locales actuales creando una rama desde master antes de reiniciar:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Después de esto, todas las confirmaciones antiguas se mantendrán en new-branch-to-save-current-commits.

Cambios no confirmados

Sin embargo, los cambios no confirmados (incluso por etapas) se perderán. Asegúrate de guardar y comprometer todo lo que necesites. Para eso, puede ejecutar lo siguiente:

git stash

Y luego para volver a aplicar estos cambios no confirmados:

git stash pop

Respondido el 28 de Septiembre de 20 a las 04:09

¡Cuidado! Si tiene confirmaciones locales sin presionar, ¡esto las eliminará de su rama! Esta solución mantiene intactos los archivos sin seguimiento que no están en el repositorio, pero sobrescribe todo lo demás. - matthijs p

Es una pregunta popular, por lo que me gustaría aclarar el comentario principal aquí. Acabo de ejecutar comandos como se describe en esta respuesta y no ha eliminado TODOS los archivos locales. Solo se sobrescribieron los archivos rastreados de forma remota y todos los archivos locales que estaban aquí se dejaron intactos. - Rojo

en caso de que esté extrayendo de un repositorio que tiene su nombre de rama remota diferente de "maestro", use git reset --hard origin/branch-name - Nervio

Dada la cantidad de votos a favor de esta pregunta y respuesta, creo que git debería incorporar un comando como git pull -f - Sófivoro

Las confirmaciones que no fueron empujadas antes del restablecimiento completo se pueden recuperar usando git reflog, que enumera todas las confirmaciones, también las que no tienen una base. Hasta que limpie su copia local usando git gc, entonces todo está perdido - Koen

Prueba esto:

git reset --hard HEAD
git pull

Debería hacer lo que quieras.

Respondido el 14 de enero de 17 a las 15:01

Hice esto y algunos archivos locales que ya no estaban en repositorio se dejaron en el disco. - Piotr Owsiak

No creo que esto sea correcto. lo anterior realizará una fusión, no sobrescribirá lo que se solicitó en la pregunta: "¿Cómo forzar a git a sobrescribirlos?" No tengo la respuesta, la estoy buscando ... en este momento cambio a la rama con el código que quiero mantener "git checkout BranchWithCodeToKeep", luego hago "git branch -D BranchToOverwrite" y finalmente "git checkout -b BranchToOverwrite". ahora tendrá el código exacto de BranchWithCodeToKeep en la rama BranchToOverwrite sin tener que realizar una combinación. - felbus

en lugar de fusionar usando 'git pull', intente git fetch --todo seguido de 'git reset --hard origin / master' - lloyd moore

sí, la solución @lloydmoore funcionó para mí. Le vendría bien ser una respuesta en lugar de un simple comentario. - max williams

Esto restablecerá los cambios actuales a la última confirmación de rama extraída. Luego, git pull fusiona los cambios de la última rama. Esto hizo exactamente lo que quería que hiciera ... ¡Gracias! - Codificado

ADVERTENCIA: git clean elimina todos los archivos / directorios sin seguimiento y no se puede deshacer.


A veces solo clean -f no ayuda. En caso de que tenga DIRECTORIOS sin seguimiento, también se necesita la opción -d:

# WARNING: this can't be undone!

git reset --hard HEAD
git clean -f -d
git pull

ADVERTENCIA: git clean elimina todos los archivos / directorios sin seguimiento y no se puede deshacer.

Considera usar -n (--dry-run) marca primero. Esto le mostrará lo que se eliminará sin eliminar nada:

git clean -n -f -d

Ejemplo de salida:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

Respondido 17 ago 18, 20:08

Puede darle a git clean un argumento de ruta para ser más específico y evitar eliminar archivos sin seguimiento que no estén en conflicto. - joachim

Creo que la descripción del escenario deja en claro que realmente no quiere tirar el contenido. Más bien, lo que quiere es dejar de resistirse a sobrescribir los archivos. @Lauri, esto no debería haberte pasado. Desafortunadamente, la gente parece haber malinterpretado la esencia de la descripción del escenario; vea mi sugerencia. - Erizo

FINALMENTE. git clean -f -d es útil cuando make clean no limpia todo. - melontierra

@crizCraig a menos que se agreguen en .gitignore - Dedos sangrantes

@earthmeLon, para eso es posible que desee git clean -dfx. -x ignora .gitignore. Normalmente, sus productos de compilación estarán en .gitignore. - Paul Draper

Como Hedgehog, creo que las respuestas son terribles. Pero aunque la respuesta de Hedgehog podría ser mejor, no creo que sea tan elegante como podría ser. La forma en que encontré para hacer esto es usando fetch y merge con una estrategia definida. Lo que debería hacer que sus cambios locales se conserven siempre que no sean uno de los archivos con los que está tratando de forzar una sobrescritura.

Primero haz una confirmación de tus cambios

 git add *
 git commit -a -m "local file server commit message"

Luego busque los cambios y sobrescriba si hay un conflicto

 git fetch origin master
 git merge -s recursive -X theirs origin/master

-X es un nombre de opción, y theirs es el valor de esa opción. Estás eligiendo usar their cambios (la otra opción es ours cambios) si hay un conflicto.

Respondido 24 Feb 21, 14:02

Esta es la mejor respuesta que he visto hasta ahora. No lo he probado, pero a diferencia de otras respuestas, esto no intenta destruir todos sus archivos sin seguimiento, lo cual es muy peligroso por razones obvias. - Huyz

Ditto: esto funcionó para mí cuando hice una fusión muy grande (solicitud de extracción de GitHub) en la que solo quería aceptarlo todo además de lo que tenía. ¡Buena respuesta! En mi caso, los dos últimos comandos fueron: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - quux00

Esto sobrescribirá cualquier conflicto con los archivos de los repositorios y no con los locales, ¿correcto? - Nathan F.

La mejor respuesta. La respuesta más alta aceptada me dejó en mi caso con la cabeza indiferente. Cambié de nuevo a la rama maestra local y ejecuté git merge -X theirs origin/master - petergus

Solo quería que el maldito git sobrescribiera todo y se callara. después de todo, solo lo estoy usando entre mi PC de trabajo y algunos sistemas Raspberry Pi. Deseando una opción de sobrescritura forzada, al menos para el líder del proyecto - mecanismo de relojería

En lugar de hacer:

git fetch --all
git reset --hard origin/master

Aconsejaría hacer lo siguiente:

git fetch origin master
git reset --hard origin/master

No es necesario buscar todos los controles remotos y las ramas si va a restablecer la rama de origen / maestra, ¿verdad?

Respondido el 14 de Septiembre de 16 a las 10:09

Su respuesta es justo lo que necesitaba para su representante. Debo preguntar, ¿esto también elimina todos los archivos sin seguimiento? - Nicolás de Jay

Sí, la mayor parte de mi representante viene de aquí :) Esto también eliminará todos los archivos sin seguimiento. Algo que había olvidado y me recordó dolorosamente hace solo 2 días ... - johanneke

Vea los comentarios sobre esta otra respuesta: stackoverflow.com/a/8888015/2151700 - johanneke

Esto no eliminó mis archivos sin seguimiento; que es en realidad lo que esperaba. ¿Hay alguna razón por la que podría serlo para algunas personas y no para otras? - arichards

Los archivos sin seguimiento no se ven afectados por git reset. Si desea que también se eliminen, hágalo git add . primero, antes git reset --hard - johanneke

Parece que la mejor manera es hacer primero:

git clean

Para eliminar todos los archivos sin seguimiento y luego continuar con lo habitual git pull...

Respondido el 14 de enero de 17 a las 15:01

Intenté usar "git clean" para resolver el mismo problema, pero no lo resolvió. git status dice "Tu rama y 'origin / master' han divergido, # y tienen 2 y 9 confirmaciones diferentes cada una, respectivamente". y git pull dice algo similar a lo que tienes arriba. - Slacy

git clean es un instrumento bastante contundente y podría tirar muchas cosas que quizás quieras conservar. Es mejor eliminar o cambiar el nombre de los archivos de los que se queja git hasta que la extracción tenga éxito. - neil mayhew

No creo que esto funcione en general. ¿No hay una manera de hacer básicamente un clon remoto de git a través de un git pull forzado? - Mathtick

@mathick: git fetch origin && git reset --hard origin/master - maestro de flechas

Is git clean la mejor respuesta aqui? Parece que eliminar archivos no es necesariamente lo que quiere el OP. Pidieron "una sobrescritura de los archivos locales", no la eliminación. - John Allen

Advertencia, hacer esto eliminará permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.

Algunas respuestas parecen terribles. Terrible en el sentido de lo que le sucedió a @Lauri al seguir la sugerencia de David Avsajanishvili.

Más bien (git> v1.7.6):

git stash --include-untracked
git pull

Más tarde, puede limpiar el historial de alijo.

Manualmente, uno por uno:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutalmente, todo a la vez:

$ git stash clear

Por supuesto, si quieres volver a lo que escondiste:

$ git stash list
...
$ git stash apply stash@{5}

respondido 07 mar '18, 07:03

No, no lo creo. El almacenamiento solo elimina los archivos no comprometidos. Lo anterior también mueve (almacena) archivos que git no rastrea. Esto evita que los archivos que se han agregado al control remoto, que aún no se han transferido a su máquina, pero que usted ha creado (!), Se eliminen. Todo sin destruir el trabajo no comprometido. ¿Espero que tenga sentido? - Erizo

Si no tiene 1.7.6, puede imitar --include-untracked simplemente por temporalmente git add-hacer todo su repositorio y luego guardarlo inmediatamente. - bueno

Estoy de acuerdo con Hedgehog. Si hace las respuestas populares aquí, es más que probable que descubra que ha matado inadvertidamente muchas cosas que realmente no quería perder. - Guardio

Tenía otros archivos sin seguimiento, además del que la combinación / extracción quería sobrescribir, por lo que esta solución funcionó mejor. git stash apply devolví todos mis archivos sin seguimiento con la excepción (con razón) de los que la fusión ya había creado: "ya existe, sin pago". Funcionó perfectamente. - grandeazulsombrero

Esta es la respuesta más limpia y debería ser la aceptada. Para ahorrar algo de escritura, puede usar la forma corta: git stash -u. - ccpizza

Puede que este comando le resulte útil para deshacerse de los cambios locales:

git checkout <your-branch> -f

Y luego haga una limpieza (elimina los archivos sin seguimiento del árbol de trabajo):

git clean -f

Si desea eliminar directorios sin seguimiento además de archivos sin seguimiento:

git clean -fd

Respondido el 14 de enero de 17 a las 15:01

Creo que la descripción del escenario deja en claro que realmente no quiere tirar el contenido. Más bien, lo que quiere es dejar de resistirse a sobrescribir los archivos. Vea mi sugerencia. - Erizo

Aunque esa respuesta podría no ajustarse exactamente a la descripción, aún me salvó de la frustración de git jugando con los retornos de carro (evento con autocrlf falso). Cuando git reset --hard HEAD no te deja con "no" archivos modificados, estos indicadores "-f" son bastante útiles. Gracias un montón. - Kellindil

En lugar de fusionarse con git pull, prueba esto:

git fetch --all

seguido por:

git reset --hard origin/master.

respondido 21 mar '18, 07:03

Lo único que funcionó para mí fue:

git reset --hard HEAD~5

Esto te llevará de vuelta cinco confirmaciones y luego con

git pull

Encontré eso mirando hacia arriba cómo deshacer una combinación de Git.

contestado el 23 de mayo de 17 a las 11:05

Esto fue lo que finalmente funcionó para mí, ya que había forzado a empujar mi rama al repositorio de origen y seguía teniendo conflictos de fusión al intentar llevarla a mi repositorio remoto. jwfrancés

Hola, en realidad, este es un truco para work around pero realmente efectivo. Debido a que algunos conflictos pueden ocurrir solo en pocas confirmaciones, revertir 5 confirmaciones asegurará que no haya conflictos con el código remoto. - hoang-le

El problema con todas estas soluciones es que son demasiado complejas o, un problema aún mayor, es que eliminan todos los archivos sin seguimiento del servidor web, lo cual no queremos, ya que siempre hay archivos de configuración necesarios que están en el servidor y no en el repositorio de Git.

Aquí está la solución más limpia que estamos usando:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • El primer comando obtiene los datos más recientes.

  • El segundo comando verifica si hay archivos que se están agregando al repositorio y elimina los archivos sin seguimiento del repositorio local que podrían causar conflictos.

  • El tercer comando comprueba todos los archivos que se modificaron localmente.

  • Finalmente hacemos un tirón para actualizar a la versión más reciente, pero esta vez sin ningún conflicto, ya que los archivos sin seguimiento que están en el repositorio ya no existen y todos los archivos modificados localmente ya son los mismos que en el repositorio.

contestado el 23 de mayo de 14 a las 22:05

Usar "git merge origin / master" como última línea (como dice en su nota) en lugar de "git pull" será más rápido, ya que ya ha eliminado los cambios del repositorio de git. - Josh

Sí, por supuesto, git merge origin/master será más rápido y probablemente incluso más seguro. Dado que si alguien empujó nuevos cambios durante la eliminación de archivos de este script (lo que no es probable que suceda, pero es posible), toda la extracción podría fallar. La única razón por la que puse pull allí es porque alguien podría no estar trabajando en la rama maestra, pero en alguna otra rama y quería que el script fuera universal. - Strahinja Kustudic

Si ha creado archivos localmente como archivos de opciones, colóquelos en .gitignore. - Sebi

En primer lugar, pruebe la forma estándar:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

advertencia: ¡Los comandos anteriores pueden provocar la pérdida de datos / archivos solo si no los ha confirmado! Si no está seguro, primero haga la copia de seguridad de toda la carpeta del repositorio.

Luego jálalo de nuevo.

Si lo anterior no ayuda y no le importan sus archivos / directorios sin seguimiento (haga la copia de seguridad primero por si acaso), intente los siguientes pasos simples:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

Esto ELIMINARÁ todos los archivos git (excempt .git/ dir, donde tiene todas las confirmaciones) y tire de él nuevamente.


¿Por qué git reset HEAD --hard podría fallar en algunos casos?

  1. Reglas personalizadas en .gitattributes file

    Tener eol=lf La regla en .gitattributes podría hacer que git modifique algunos cambios de archivo convirtiendo los finales de línea CRLF en LF en algunos archivos de texto.

    Si ese es el caso, debe confirmar estos cambios CRLF / LF (revisándolos en git status), o tratar: git config core.autcrlf false para ignorarlos temporalmente.

  2. Incompatibilidad del sistema de archivos

    Cuando usa un sistema de archivos que no admite atributos de permisos. Por ejemplo, tiene dos repositorios, uno en Linux / Mac (ext3/hfs+) y otro en el sistema de archivos basado en FAT32 / NTFS.

    Como puede observar, hay dos tipos diferentes de sistemas de archivos, por lo que el que no admite permisos de Unix básicamente no puede restablecer los permisos de archivos en el sistema que no admite ese tipo de permisos, así que no importa cómo --hard lo intentas, git siempre detecta algunos "cambios".

Respondido el 31 de enero de 19 a las 15:01

Yo tuve el mismo problema. Nadie me dio esta solución, pero funcionó para mí.

Lo resolví por:

  1. Elimina todos los archivos. Deja solo el .git directorio.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Ahora funciona.

Respondido el 18 de enero de 19 a las 23:01

Aquí igual. A veces, solo funciona la solución muy difícil, sucede a menudo que solo restablecer y limpiar no son suficientes de alguna manera ... jdehaan

Bonificación:

Al hablar de pull / fetch / merge en las respuestas anteriores, me gustaría compartir un truco interesante y productivo,

git pull --rebase

Este comando anterior es el comando más útil en mi vida de Git que me ahorró mucho tiempo.

Antes de enviar su nueva confirmación al servidor, pruebe este comando y sincronizará automáticamente los últimos cambios del servidor (con una búsqueda + combinación) y colocará su confirmación en la parte superior del registro de Git. No hay necesidad de preocuparse por la combinación / extracción manual.

Encuentra detalles en ¿Qué hace "git pull --rebase"?.

Respondido el 20 de junio de 20 a las 10:06

En breve: git pull -r. - Kenorb

En mi caso, antes de hacer eso, tuve que 1) git add -A, 2) git commit -m 3) y finalmente git pull rebase. Gracias. - Patros

Tuve un problema similar. Tuve que hacer esto:

git reset --hard HEAD
git clean -f
git pull

respondido 06 nov., 11:16

utilizan el git clean con cuidado - bueno

Resumí otras respuestas. Puedes ejecutar git pull sin errores:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

advertencia: Este script es muy poderoso, por lo que podría perder sus cambios.

Respondido el 14 de enero de 17 a las 15:01

Esto sobrescribirá los archivos modificados (archivos que se registraron previamente) y eliminará los archivos sin seguimiento (archivos que nunca se han registrado). Exactamente lo que estaba buscando, gracias! - estilo

Sospecho que la tercera linea git reset --hard HEAD puede ser redundante; mi página de manual local (2.6.3) dice que reset en la segunda linea git reset --hard origin/master "por defecto es HEAD en todas las formas". - arichards

@arichards Creo que su sospechoso tiene razón, pero si la segunda línea no funciona (por cualquier motivo), la tercera línea funciona bien para restablecer. Esta solución no necesita optimizarse. Acabo de resumir otras respuestas. Eso es todo. Gracias por tu comentario. :) - roberto luna

Gracias por el resumen. Estos pasos son realmente poderosos :) - glorian

Basado en mis propias experiencias similares, la solución ofrecida por Strahinja Kustudic arriba es, con mucho, la mejor. Como han señalado otros, simplemente hacer un restablecimiento completo eliminará todos los archivos sin seguimiento que podrían incluir muchas cosas que no desea eliminar, como archivos de configuración. Lo que es más seguro es eliminar solo los archivos que están a punto de agregarse y, para el caso, es probable que también desee verificar cualquier archivo modificado localmente que esté a punto de actualizarse.

Con eso en mente, actualicé el guión de Kustudic para hacer precisamente eso. También solucioné un error tipográfico (faltaba en el original).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull

Respondido 14 ago 15, 00:08

Usar "git merge origin / master" como última línea (como dice en su nota) en lugar de "git pull" será más rápido, ya que ya ha eliminado los cambios del repositorio de git. - Josh

Se necesita la comprobación de archivos modificados, por lo que esto funciona el 100% de las veces. Actualicé mi script con eso hace mucho tiempo, pero también olvidé actualizar aquí. También lo uso un poco diferente a ti. Reviso archivos que tienen algún tipo de modificación, no solo M, por lo que funciona todo el tiempo. - Strahinja Kustudic

Creo que hay dos posibles causas de conflicto, que deben resolverse por separado, y por lo que puedo decir, ninguna de las respuestas anteriores se ocupa de ambas:

  • Los archivos locales que no se rastrean deben eliminarse, ya sea manualmente (más seguro) o como se sugiere en otras respuestas, por git clean -f -d

  • Las confirmaciones locales que no están en la rama remota también deben eliminarse. En mi opinión, la forma más fácil de lograr esto es con: git reset --hard origin/master (reemplace 'master' por cualquier rama en la que esté trabajando y ejecute un git fetch origin primero)

Respondido el 12 de diciembre de 11 a las 20:12

Una forma más sencilla sería:

git checkout --theirs /path/to/file.extension
git pull origin master

Esto anulará su archivo local con el archivo en git

contestado el 05 de mayo de 15 a las 09:05

git fetch --all && git reset --hard origin/master && git pull

contestado el 12 de mayo de 19 a las 16:05

Parece que la mayoría de las respuestas aquí se centran en el master rama; sin embargo, hay ocasiones en las que estoy trabajando en la misma rama de función en dos lugares diferentes y quiero que un rebase en uno se refleje en el otro sin tener que saltar muchos obstáculos.

Basado en una combinación de La respuesta del ARN y la respuesta de torek a una pregunta similar, Se me ocurrió esto que funciona espléndidamente:

git fetch
git reset --hard @{u}

Ejecute esto desde una sucursal y solo restablecerá su sucursal local a la versión ascendente.

Esto se puede poner muy bien en un alias de git (git forcepull) también:

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

O en tu .gitconfig archivo:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

¡Que la disfrutes!

contestado el 23 de mayo de 17 a las 13:05

Esta respuesta también es buena porque funciona independientemente de la rama en la que se encuentre. - harina de hojas

Tuve el mismo problema y por alguna razón, incluso un git clean -f -d no lo haría. Este es el motivo: por alguna razón, si Git ignora su archivo (a través de una entrada .gitignore, supongo), todavía se molesta en sobrescribirlo con una versión posterior. recogida , Pero una limpia no lo eliminará, a menos que agregue -x.

respondido 18 mar '15, 19:03

Conozco un método mucho más fácil y menos doloroso:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

¡Eso es!

Respondido el 05 de Septiembre de 18 a las 17:09

Intenté hacer lo que se sugiere en esta respuesta. NINGÚN ARCHIVO se extrajo del repositorio remoto. En realidad, no es muy sorprendente cuando lo piensas; después de todo, no hay ninguna referencia a origin/<branch_to_force_pull>. - Henke

Acabo de resolver esto yo mismo de la siguiente manera:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

donde el último comando da una lista de cuáles fueron sus cambios locales. Siga modificando la rama "tmp" hasta que sea aceptable y luego vuelva a fusionarla con la maestra con:

git checkout master && git merge tmp

Para la próxima vez, probablemente puedas manejar esto de una manera más limpia buscando "git stash branch", aunque es probable que stash te cause problemas en los primeros intentos, así que primero experimenta en un proyecto no crítico ...

Respondido el 14 de enero de 17 a las 15:01

Tengo una extraña situación que ni git clean or git reset obras. Tengo que eliminar el archivo conflictivo de git index mediante el uso de la siguiente secuencia de comandos en cada archivo sin seguimiento:

git rm [file]

Entonces puedo tirar bien.

Respondido el 05 de diciembre de 17 a las 04:12

git fetch --all

entonces si estás en la rama maestra

git reset --hard origin/master

más

git reset --hard origin/master<branch_name>

Respondido 15 ago 19, 07:08

El último fragmento debería ser origin/<branch_name> no origin/master<branch_name>. - Adrian

A pesar de la pregunta original, las respuestas principales pueden causar problemas a las personas que tienen un problema similar, pero no quieren perder sus archivos locales. Por ejemplo, vea los comentarios de Al-Punk y crizCraig.

La siguiente versión confirma sus cambios locales en una rama temporal (tmp), comprueba la rama original (que supongo que es master) y fusiona las actualizaciones. Podrías hacer esto con stash, pero descubrí que generalmente es más fácil usar el enfoque de rama / fusión.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch origin master
git merge -s recursive -X theirs origin master

donde asumimos el otro repositorio is origin master.

respondido 18 mar '15, 19:03

Solo haz

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

De este modo, evita todos los efectos secundarios no deseados, como eliminar archivos o directorios que desea conservar, etc.

Respondido el 14 de enero de 17 a las 15:01

Lindo. Al usar primero checkout -f en la rama desde la que quería fusionarme, que eliminó todos los archivos problemáticos sin seguimiento. Luego pude volver a pagar mi destino y finalmente fusionarme sin problemas. - Patricio Parker

Restablezca el índice y la cabeza a origin/master, pero no restablezca el árbol de trabajo:

git reset origin/master

Respondido 15 Feb 13, 13:02

Personalmente, encontré esto muy útil. Luego mantiene su árbol de trabajo para que pueda registrarlo nuevamente. Para mi problema, se eliminaron los mismos archivos que se agregaron, por lo que se atascó. Extraño, lo sé. - jason sebring

Estos cuatro comandos funcionan para mí.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Para verificar / tirar después de ejecutar estos comandos

git pull origin master

Intenté mucho, pero finalmente tuve éxito con estos comandos.

respondido 20 mar '14, 04:03

"git branch -D master" elimina la rama. así que ten cuidado con eso. Prefiero usar "git checkout origin / master -b "que crea una nueva rama con un nuevo nombre y ya necesita 3,4 líneas. También se recomienda usar" git clean -f "también. - Chand Priyankara

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.