¿Cómo resuelvo git diciendo "Confirme sus cambios o guárdelos antes de que pueda fusionar"?

763

Hice algunas actualizaciones en mi máquina local, las envié a un repositorio remoto, y ahora estoy tratando de obtener los cambios en el servidor y recibo el mensaje;

error: sus cambios locales en los siguientes archivos se sobrescribirán mediante fusión:

wp-content / w3tc-config / master.php

Por favor, confirme sus cambios o guárdelos antes de poder fusionarse.

Entonces corrí

git checkout -- wp-content/w3tc-config/master.php

e intenté de nuevo y recibí el mismo mensaje. Supongo que eso w3tccambió algo en el archivo de configuración en el servidor. No me importa si la copia local o la copia remota van al servidor (supongo que la remota es la mejor), solo quiero poder fusionar el resto de mis cambios (actualizaciones de complementos).

¿Algunas ideas?

Jo Sprague
fuente
11
Esta es una pregunta más explícita con más detalles y una mejor respuesta. Creo que es valioso mantener este alrededor. Sí, el otro fue técnicamente preguntado primero, pero eliminarlo dificultaría a las personas encontrar las respuestas que están buscando.
Jo Sprague

Respuestas:

1301

No puede fusionarse con modificaciones locales. Git te protege de perder cambios potencialmente importantes.

Tienes tres opciones:

  • Cometer el cambio usando

    git commit -m "My message"
    
  • Guárdalo.

    El alijo actúa como una pila, donde puede empujar los cambios, y los revienta en orden inverso.

    Para esconder, escriba

    git stash
    

    Haz la fusión y luego saca el alijo:

    git stash pop
    
  • Descartar los cambios locales.

    usando git reset --hard
    ogit checkout -t -f remote/branch

    O bien: descarte los cambios locales para un archivo específico

    utilizando git checkout filename

stdcall
fuente
104
También puede descartar cambios locales para un archivo específico haciendo: git checkout filename
ckb
66
Gracias. Agregaría a esto, si lo hace git reset --hard, también puede eliminar archivos no rastreados congit clean -dfx
Jo Sprague
13
Por defecto git stash, no guardará archivos para los que no hay historial. Por lo tanto, si tiene archivos que aún no ha agregado pero que se sobrescribirán o "crearán" con la fusión, la fusión seguirá bloqueándose. En esa situación, también puede usar git stash -upara guardar archivos no confirmados. ¡O simplemente puedes eliminarlos!
joeytwiddle
25
correr git clean -dfxera una idea terrible. Eliminé algunos archivos .gitignored que realmente necesitaba.
ezuk
55
¡He encontrado una situación en la que un usuario, después de hacerlo git reset --hard, todavía tenía cambios no fusionados!
Amedee Van Gasse
83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

El primer comando almacena sus cambios temporalmente en el alijo y los elimina del directorio de trabajo.

El segundo comando cambia de rama.

El tercer comando restaura los cambios que ha almacenado en el escondite (la --indexopción es útil para asegurarse de que los archivos almacenados sigan almacenados).

Loganathan
fuente
1
stackoverflow.com/questions/15286075/… , también puede ser útil
vikramvi
2
para explicar el punto de @vikramvi: también podemos usar en git stash poplugar de git stash apply. El primero lo retira del escondite mientras que el segundo todavía lo mantiene allí
Anupam
27

Puede probar uno de los siguientes métodos:

rebase

Para cambios simples, intente rebasar encima mientras tira de los cambios, por ej.

git pull origin master -r

Por lo tanto, aplicará su rama actual en la parte superior de la rama aguas arriba después de buscar.

Esto es equivalente a: checkout master, fetchy rebase origin/masterlos comandos de Git.

Este es un modo de operación potencialmente peligroso. Reescribe el historial, que no es un buen augurio cuando ya publicaste ese historial. No use esta opción a menos que haya leído git-rebase(1)detenidamente.


revisa

Si no le importan sus cambios locales, puede cambiar a otra rama temporal (con fuerza) y volver a cambiarla, p. Ej.

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

Reiniciar

Si no le importan sus cambios locales, intente restablecerlo a HEAD (estado original), p. Ej.

git reset HEAD --hard

Si lo anterior no ayuda, puede haber reglas en su archivo de normalización de git ( .gitattributes), por lo que es mejor confirmar lo que dice. O su sistema de archivos no admite permisos, por lo que debe deshabilitar filemodesu configuración de git.

Relacionado: ¿Cómo fuerzo "git pull" para sobrescribir los archivos locales?

kenorb
fuente
1
No funciona: sigo recibiendo el mismo mensaje como "esconde tus cambios primero". Cuando escribo "git stash" y luego "git pull" -> "error: tienes cambios sin guardar ... haz un escondite primero". Poco antes de destruir mi computadora
trinity420
@ trinity420 ¿Podrían ser sus permisos de archivos? Compruebe git statusqué cambios tiene después de guardarlos. Si ninguna respuesta ayuda, considere agregar una nueva pregunta.
kenorb
gracias, pero mi problema se resolvió, probé todo aquí, nada funcionó, luego hice clic en "confirmar cambios", "fusionar" en PHPStorm y luego desestimé los cambios y funcionó ...
trinity420
13

Entonces, la situación con la que me encontré fue la siguiente:

error: sus cambios locales en los siguientes archivos se sobrescribirán con merge: wp-content / w3tc-config / master.php Por favor, confirme los cambios o guárdelos antes de poder fusionarlos.

excepto, justo antes de eso, era remoto: así que en realidad esto

remoto: error: sus cambios locales en los siguientes archivos se sobrescribirán con merge: some / file.ext Por favor, confirme los cambios o guárdelos antes de poder fusionarlos.

Lo que estaba sucediendo era (creo que no era 100% positivo) que el gancho de recepción de git post comenzaba a ejecutarse y se arruinaba debido a cambios de movimiento en el repositorio del servidor remoto, que en teoría no debería haberse tocado.

Entonces, lo que terminé haciendo al rastrear el gancho posterior a la recepción y encontrar esto, fue tener que ir al repositorio remoto en el servidor, y hubo un cambio (que no estaba en mi repositorio local, que, de hecho, dijo que coincidía, no había cambios, no había nada que confirmar, estaba actualizado, etc.) Entonces, mientras estaba en el local, no hubo cambios, en el servidor, luego hice un git checkout -- some/file.exty luego los repositorios locales y remotos realmente coincidieron y pude continuar trabajando y desplegar. No estoy completamente seguro de cómo ocurrió esta situación, aunque un par de docenas de desarrolladores más los cambios de TI pueden tener algo que ver con eso.

Miguel
fuente
2
¿Es una pregunta o una respuesta?
stdcall
2
@stdcall: un poco de ambos. Cuando me encontré con esta situación como se describe en la pregunta, esto es lo que tuve que hacer para solucionarlo. Definitivamente no fue una resolución normal de git, y de la pregunta, parece que podría ser la misma situación anormal (es decir, cambios de configuración en el servidor, pero el local no tiene cambios). Si alguien tiene más idea de por qué (o cómo) sucedió esto, agradecería cualquier idea.
Mike
7

ADVERTENCIA: Esto eliminará los archivos no rastreados, por lo que no es una gran respuesta a esta pregunta.

En mi caso, no quería conservar los archivos, así que esto funcionó para mí:

Git 2.11 y más reciente:

git clean  -d  -fx .

Git mayor:

git clean  -d  -fx ""

Referencia: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x significa que también se eliminan los archivos ignorados, así como los archivos desconocidos para git.

  • -d significa eliminar directorios no rastreados además de archivos no rastreados.

  • -f es requerido para forzarlo a correr.

Materia oscura
fuente
4

Para mantener un registro de sus archivos recién creados mientras resuelve este problema:

Si ha creado archivos recientemente , puede crear un parche de cambios locales, incorporar fusiones remotas y aplicar su parche local después de que se complete la fusión remota como se define paso a paso a continuación:

  1. Organice sus cambios locales. (no comprometerse) La puesta en escena es necesaria para crear parches de nuevos archivos creados (ya que aún no se han rastreado)

git add .

  1. Crea un parche para mantener un registro

git diff --cached > mypatch.patch

  1. Descarte los cambios locales y elimine los nuevos archivos locales

git reset --hard

  1. Tire de los cambios

git pull

  1. Aplica tu parche

git apply mypatch.patch

Git fusionará los cambios y creará archivos .rej para los cambios que no se fusionan.

Según lo sugerido por Anu, si tiene problemas para aplicar el parche, intente:

git apply --reject --whitespace=fix mypatch.patch Esta respuesta git: parche no aplica charlas en detalle sobre este tema

Disfrute de su trabajo continuo en su función y confirme los cambios locales cuando termine.

Manpreet
fuente
Quería insertar una parte del código con nuevos cambios, así que lo hice: 1. creé un parche de mi rama de desarrollo local 2. realicé el restablecimiento completo 3. extraje los nuevos cambios de maestro a desarrollador (para evitar conflictos de fusión) 4 Hice un pequeño cambio en mi desarrollador local 5. Empujé al desarrollador remoto 6. error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyApliqué el parche de nuevo -> Recibí un error: todavía tengo mypatch.patch, pero no sé por qué no se está aplicando y perdí mis cambios. !
Anu
Lo entendí, el comando correcto fue git apply --reject --whitespace=fix mypatch.patch, ¡recuperé mis cambios! [Gracias a] ( stackoverflow.com/a/15375869/6484358 )
Anu
1
Anu, el comando git apply mypatch.patch es correcto para aplicar el parche, esto es lo que uso todo el tiempo, puede haber algún problema con el parche creado en sí, y nunca pierdes los cambios si tienes el parche en la mano. contiene todos los cambios consolidados.
Manpreet
2

Pedir compromiso antes de tirar

  • escondite
  • origen de extracción de git << nombre de sucursal >>

Si es necesario :

  • git alijo aplicar
Rahul Mankar
fuente
1
Use git stash cuando desee registrar el estado actual del directorio de trabajo y el índice, pero desee volver a un directorio de trabajo limpio. El comando guarda sus modificaciones locales y revierte el directorio de trabajo para que coincida con la confirmación HEAD.
Pushpak Sharma el
2

Para mí solo git reset --hardfuncionó.

Comprometerse no era una opción, ya que no había nada que comprometerse.

El escondite no era una opción porque no había nada que esconder.

Parece que podría haber sido de archivos excluidos .git/info/excludey haber git update-index --assume-unchanged <file>editado algunos archivos.

León
fuente
0

En mi caso, hice una copia de seguridad y luego eliminé el archivo del que Git se quejaba, lo comprometí, y finalmente pude verificar otra rama.

Luego reemplacé el archivo, volví a copiar el contenido y continué como si nada hubiera pasado.

CodyBugstein
fuente
0

Intenté la primera respuesta: git stashcon la puntuación más alta pero el mensaje de error seguía apareciendo, y luego encontré este artículo para confirmar los cambios en lugar de esconder 'Compromiso renuente'

y el mensaje de error desapareció finalmente:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

entonces funcionó. Espero que esta respuesta ayude. :)

Sophie cai
fuente
0

Si está utilizando Git Extensions , debería poder encontrar sus cambios locales en el Working directorysiguiente:

ingrese la descripción de la imagen aquí

Si no ve ningún cambio, probablemente sea porque está en un submódulo incorrecto. Así que verifique todos los artículos con un icono de submarino como se muestra a continuación:

ingrese la descripción de la imagen aquí

Cuando encuentre algún cambio no comprometido:

Seleccione la línea con Working directory, vaya a Dif pestaña, haga clic en el botón derecho en filas con un lápiz (o +o -icono), seleccione Restablecer para cometer primera o cometer o escondite o lo que usted quiere hacer con ella.

Bizhan
fuente
0

Para mí esto funcionó:

git reset --hard

y entonces

git pull origin <*current branch>

después de esto

git checkout <*branch>

Chloe
fuente
0

Probablemente

git --rebase --autostash

ayudaría

Eugen Konkov
fuente