¿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_overwrite
git branch <branch> -D
2. Restablecer una confirmación antes del conflicto:git reset <commit> --hard
3. 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
--hard
opció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 fetch
descarga lo último desde el control remoto sin intentar fusionar o volver a crear nada.Luego,
git reset
restablece la rama maestra a lo que acaba de obtener. La--hard
opción cambia todos los archivos en su árbol de trabajo para que coincidan con los archivos enorigin/master
Mantener compromisos locales actuales
[*] : Vale la pena señalar que es posible mantener las confirmaciones locales actuales creando una rama desde
master
antes 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-name
git pull -f
git 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 clean
elimina todos sus archivos / directorios sin seguimiento y no se puede deshacer.A veces simplemente
clean -f
no ayuda. En caso de que haya rastreado DIRECTORIOS, también se necesita la opción -d:ADVERTENCIA:
git clean
elimina 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
.gitignore
git clean -dfx
. El-x
ignora .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/master
git merge -X theirs origin/master
En 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 --hard
Parece 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/master
git clean
la 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-untracked
simplemente haciendo temporalmentegit add
su repositorio completo y luego escondiéndolo de inmediato.git stash apply
recuperé 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 --all
seguido 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 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.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/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), todo el tirón podría fallar. La única razón por la que pusepull
allí 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 --hard
podría fallar en algunos casos?Reglas personalizadas en
.gitattributes file
Teniendo
eol=lf
regla 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 false
ignorarlos 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
--hard
lo 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:
.git
directorio.git reset --hard HEAD
git pull
git push
Ahora funciona.
fuente
Prima:
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 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 clean
con precauciónResumí otras respuestas. Puede ejecutar
git pull
sin errores:Advertencia : este script es muy poderoso, por lo que podría perder sus cambios.
fuente
git reset --hard HEAD
puede ser redundante; mi página de manual local (2.6.3) dice quereset
en 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 -d
Las 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 origin
primera)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
master
rama; 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
.gitconfig
archivo:¡Disfrutar!
fuente
Tuve el mismo problema y, por alguna razón, incluso un
git clean -f -d
no 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 clean
ogit reset
trabajos. Tengo que eliminar el archivo en conflictogit index
mediante el siguiente script en cada archivo sin seguimiento:Entonces puedo tirar bien.
fuente
git fetch --all && git reset --hard origin/master && git pull
fuente
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