¿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 para un sitio web en el que estamos trabajando
- Están agregando algunas imágenes al directorio de imágenes (pero olvida agregarlas bajo control de fuente)
- Me envían las imágenes por correo, más tarde, a mí.
- Estoy agregando las imágenes bajo el control de fuente y empujándolas a GitHub junto con otros cambios
- No pueden obtener actualizaciones de GitHub porque Git no quiere sobrescribir sus archivos.
Este es el error que recibo:
error: el archivo de árbol de trabajo no rastreado 'public / images / icon.gif' se sobrescribirá por fusión
¿Cómo fuerzo 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 necesitan actualizar en su computadora.

git reset --hard origin/branch_to_overwritegit branch <branch> -D2. Restablecer una confirmación antes del conflicto:git reset <commit> --hard3. Volver a crear la rama:git branch <branch>4. Establecer el seguimiento al servidor:git --set-upstream-to=origin/<branch> <branch> 5. Pull:git pull`git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .Respuestas:
Importante: si tiene cambios locales, se perderán. Con o sin
--hardopción, se perderán todas las confirmaciones locales que no se hayan presionado. [*]Si tienes archivos que son Git no rastrea (por ejemplo, contenido de usuario cargado), estos archivos no se verán afectados.
Creo que esta es la forma correcta:
Entonces, tienes dos opciones:
O si está en alguna otra rama:
Explicación:
git fetchdescarga lo último desde el control remoto sin intentar fusionar o volver a crear nada.Luego,
git resetrestablece la rama maestra a lo que acaba de obtener. La--hardopción cambia todos los archivos en su árbol de trabajo para que coincidan con los archivos enorigin/masterMantener compromisos locales actuales
[*] : Vale la pena señalar que es posible mantener las confirmaciones locales actuales creando una rama desde
masterantes de reiniciar:Después de esto, todos los compromisos anteriores se mantendrán
new-branch-to-save-current-commits.Cambios no comprometidos
Sin embargo, los cambios no comprometidos (incluso por etapas) se perderán. Asegúrate de guardar y comprometer todo lo que necesites. Para eso puedes ejecutar lo siguiente:
Y luego para volver a aplicar estos cambios no comprometidos:
fuente
git reset --hard origin/branch-namegit pull -fgit reflog, que enumera todos los commits, también aquellos sin una base. Hasta que limpie su copia local usandogit gc, entonces todo está perdidoPrueba esto:
Debería hacer lo que quieras.
fuente
ADVERTENCIA:
git cleanelimina todos sus archivos / directorios sin seguimiento y no se puede deshacer.A veces simplemente
clean -fno ayuda. En caso de que haya rastreado DIRECTORIOS, también se necesita la opción -d:ADVERTENCIA:
git cleanelimina todos sus archivos / directorios sin seguimiento y no se puede deshacer.Considere usar la bandera
-n(--dry-run) primero. Esto le mostrará lo que se eliminará sin eliminar nada:Salida de ejemplo:
fuente
.gitignoregit clean -dfx. El-xignora .gitignore. Por lo general, sus productos de compilación estarán en .gitignore.Al igual que 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é esto es mediante el uso de "buscar" y "fusionar" 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á intentando forzar una sobrescritura.
Primero haz una confirmación de tus cambios
Luego busque los cambios y sobrescriba si hay un conflicto
"-X" es el nombre de una opción, y "suyo" es el valor de esa opción. Está eligiendo usar "sus" cambios, en lugar de "sus" cambios si hay un conflicto.
fuente
get fetch other-repo; 2)git merge -s recursive -X theirs other-repo/mastergit merge -X theirs origin/masterEn lugar de hacer:
Aconsejaría hacer lo siguiente:
No es necesario recuperar todos los controles remotos y ramas si va a restablecer el origen / rama maestra, ¿verdad?
fuente
git add .primero, antesgit reset --hardParece que la mejor manera es hacer primero:
Para eliminar todos los archivos no rastreados y luego continuar con lo habitual
git pull...fuente
git fetch origin && git reset --hard origin/mastergit cleanla mejor respuesta aquí? Parece que eliminar archivos no es necesariamente lo que quiere el OP. Pidieron 'una sobrescritura de archivos locales', no la eliminación.Advertencia, hacer esto eliminará permanentemente sus archivos si tiene alguna entrada de directorio / * en su archivo gitignore.
Algunas respuestas parecen ser terribles. Terrible en el sentido de lo que le sucedió a @Lauri siguiendo la sugerencia de David Avsajanishvili.
Más bien (git> v1.7.6):
Más tarde puede limpiar el historial de alijo.
Manualmente, uno por uno:
Brutalmente, todo a la vez:
Por supuesto, si quieres volver a lo que escondiste:
fuente
--include-untrackedsimplemente haciendo temporalmentegit addsu repositorio completo y luego escondiéndolo de inmediato.git stash applyrecuperé todos mis archivos no rastreados con la excepción (correctamente) de los que la fusión ya había creado: "ya existe, no hay pago". Funcionó a la perfección.git stash -u.Puede encontrar este comando útil para descartar cambios locales:
Y luego haga una limpieza (elimina los archivos no rastreados del árbol de trabajo):
Si desea eliminar directorios sin seguimiento además de archivos sin seguimiento:
fuente
En lugar de fusionarse con
git pull, intente esto:git fetch --allseguido por:
git reset --hard origin/master.fuente
Lo único que funcionó para mí fue:
Esto te llevará de vuelta cinco commits y luego con
Descubrí que al buscar cómo deshacer una fusión Git .
fuente
work aroundpero 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.El problema con todas estas soluciones es que todas son demasiado complejas o, un problema aún mayor, es que eliminan todos los archivos no rastreados del servidor web, lo que no queremos, ya que siempre se necesitan archivos de configuración que estén activados. el servidor y no en el repositorio de Git.
Aquí está la solución más limpia que estamos usando:
El primer comando obtiene los datos más nuevos.
El segundo comando verifica si hay archivos que se están agregando al repositorio y elimina esos archivos no rastreados del repositorio local que podrían causar conflictos.
El tercer comando desprotege todos los archivos que se modificaron localmente.
Finalmente, hacemos un esfuerzo para actualizar a la versión más nueva, pero esta vez sin ningún conflicto, ya que los archivos no rastreados que están en el repositorio ya no existen y todos los archivos modificados localmente ya son los mismos que en el repositorio.
fuente
git merge origin/masterserá 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), todo el tirón podría fallar. La única razón por la que pusepullallí es porque alguien podría no estar trabajando en la rama maestra, pero alguna otra rama y yo quería que el guión fuera universal..gitignore.En primer lugar, pruebe la forma estándar:
Advertencia : ¡Los comandos anteriores pueden provocar la pérdida de datos / archivos solo si no los ha confirmado! Si no está seguro, haga la copia de seguridad primero de toda su carpeta de 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:
Esto eliminará todos los archivos git (
.git/directorio exempt , donde tiene todos los commits) y lo extraerá nuevamente.¿Por qué
git reset HEAD --hardpodría fallar en algunos casos?Reglas personalizadas en
.gitattributes fileTeniendo
eol=lfregla en .gitattributes podría hacer que git modifique algunos cambios de archivo al convertir las terminaciones de línea CRLF en LF en algunos archivos de texto.Si ese es el caso, debe confirmar estos cambios CRLF / LF (revisándolos
git status) o intentar:git config core.autcrlf falseignorarlos temporalmente.Incompatibilidad del sistema de archivos
Cuando usa un sistema de archivos que no admite atributos de permiso. Por ejemplo, tiene dos repositorios, uno en Linux / Mac (
ext3/hfs+) y otro en el sistema de archivos basado en FAT32 / NTFS.Como notará, 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
--hardlo intente, git detectar siempre algunos "cambios".fuente
Yo tuve el mismo problema. Nadie me dio esta solución, pero funcionó para mí.
Lo resolví por:
.gitdirectorio.git reset --hard HEADgit pullgit pushAhora funciona.
fuente
Prima:
Al hablar de pull / fetch / merge en las respuestas anteriores, me gustaría compartir un truco interesante y productivo,
git pull --rebaseEste comando anterior es el comando más útil en mi vida Git que 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 extracción / fusión manual.
Encuentre detalles en ¿Qué hace "git pull --rebase"? .
fuente
git pull -r.Tuve un problema similar. Tuve que hacer esto:
fuente
git cleancon precauciónResumí otras respuestas. Puede ejecutar
git pullsin errores:Advertencia : este script es muy poderoso, por lo que podría perder sus cambios.
fuente
git reset --hard HEADpuede ser redundante; mi página de manual local (2.6.3) dice quereseten la segunda líneagit reset --hard origin/master"el valor predeterminado es HEAD en todas sus formas".Basado en mis propias experiencias similares, la solución ofrecida por Strahinja Kustudic es la mejor con diferencia. Como otros han señalado, simplemente haciendo un restablecimiento completo eliminará todo los archivos no rastreados que podrían incluir muchas cosas que no desea eliminar, como los 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.
Eso en mente, actualicé el guión de Kustudic para hacer precisamente eso. También arreglé un error tipográfico (falta un 'en el original).
fuente
Creo que hay dos posibles causas de conflicto, que deben resolverse por separado, y por lo que puedo decir, ninguna de las respuestas anteriores trata con ambas:
Los archivos locales sin seguimiento deben eliminarse, ya sea manualmente (más seguro) o como se sugiere en otras respuestas, por
git clean -f -dLas confirmaciones locales que no están en la rama remota también deben eliminarse. OMI, la forma más fácil de lograr esto es con:
git reset --hard origin/master(reemplace 'maestro' por cualquier rama en la que esté trabajando y ejecute unagit fetch originprimera)fuente
Una forma más fácil sería:
Esto anulará su archivo local con el archivo en git
fuente
Parece que la mayoría de las respuestas aquí se centran en la
masterrama; Sin embargo, hay momentos en los que estoy trabajando en la misma rama de características en dos lugares diferentes y quiero que un rebase en uno se refleje en el otro sin tener que saltar muchos aros.Sobre la base de una combinación de la respuesta de ARN y la respuesta de torek a una pregunta similar , se me ha ocurrido con este que funciona espléndidamente:
Ejecute esto desde una rama y solo restablecerá su rama local a la versión anterior.
Esto también se puede poner muy bien en un git alias (
git forcepull):git config alias.forcepull "!git fetch ; git reset --hard @{u}"O, en su
.gitconfigarchivo:¡Disfrutar!
fuente
Tuve el mismo problema y, por alguna razón, incluso un
git clean -f -dno lo haría. Aquí está la razón: por alguna razón, si Git ignora su archivo (a través de una entrada .gitignore, supongo), todavía se molesta en sobrescribir esto con una extracción posterior , pero una limpieza no lo eliminará, a menos que agregue-x.fuente
Sé de un método mucho más fácil y menos doloroso:
¡Eso es!
fuente
Acabo de resolver esto yo mismo:
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 fusionarse con el maestro con:
Para la próxima vez, probablemente pueda manejar esto de una manera más limpia al buscar "git stash branch", aunque es probable que stash le cause problemas en los primeros intentos, así que primero experimente en un proyecto no crítico ...
fuente
Tengo una situación que ni extraña
git cleanogit resettrabajos. Tengo que eliminar el archivo en conflictogit indexmediante el siguiente script en cada archivo sin seguimiento:Entonces puedo tirar bien.
fuente
git fetch --all && git reset --hard origin/master && git pullfuente
A pesar de la pregunta original, las respuestas principales pueden causar problemas a las personas que tienen un problema similar, pero que no quieren perder sus archivos locales. Por ejemplo, vea los comentarios de Al-Punk y crizCraig.
La siguiente versión confirma los cambios locales en una rama temporal (
tmp), comprueba la rama original (que supongo que esmaster) y combina las actualizaciones. Puede hacer esto constash, pero he descubierto que generalmente es más fácil simplemente usar el enfoque de bifurcación / fusión.donde suponemos que el otro depósito es
origin master.fuente
Estos cuatro comandos me funcionan.
Para verificar / extraer después de ejecutar estos comandos
Intenté mucho pero finalmente obtuve éxito con estos comandos.
fuente
Solo haz
Por lo tanto, evita todos los efectos secundarios no deseados, como eliminar archivos o directorios que desea conservar, etc.
fuente
Restablezca el índice y la cabeza
origin/master, pero no restablezca el árbol de trabajo:fuente
Requisitos:
Solución:
Obtenga una limpieza de archivos y directorios ignorando .gitignore y restablecimiento completo al origen .
fuente