Resolver conflictos utilizando cambios remotos al extraer desde Git Remote

297

Estoy tratando de extraer el código de mi repositorio de GitHub en mi servidor, pero la extracción sigue fallando debido a conflictos de fusión. No quiero conservar ninguno de los cambios que pueden haberse producido en mi servidor local desde la última extracción.

Entonces, ¿hay alguna manera de forzar a Git a sobrescribir con cualquier versión que esté en GitHub, en lugar de molestarme por los conflictos?

David Tuite
fuente
44
@nvm: No Se trata de conflictos de fusión reales, no de archivos sin seguimiento que se sobrescribirán.
Cascabel

Respuestas:

491

Si realmente desea descartar las confirmaciones que ha realizado localmente, es decir, nunca volver a tenerlas en el historial, no está preguntando cómo extraer, extraer significa fusionar y no necesita fusionar. Todo lo que necesitas hacer es esto:

# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

Yo personalmente recomendaría crear primero una rama de respaldo en su HEAD actual, de modo que si se da cuenta de que esta es una mala idea, no la haya perdido de vista.

Si, por otro lado, desea mantener esas confirmaciones y hacer que parezca que se fusionó con el origen, y hacer que la fusión mantenga solo las versiones de origen, puede usar la oursestrategia de fusión:

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master
Cascabel
fuente
1
En el segundo bloque de comandos de git, ¿debería haber un 'origen de búsqueda de git' después del segundo comando?
David Tuite
@David: Sí, debes buscar desde el origen en algún momento. Lo siento, lo consideré implícito.
Cascabel
2
No hay nada que pueda quedar implícito cuando se trata de mí y git ;-). En serio, gracias, un millón. Sus respuestas son exactamente lo que estaba buscando.
David Tuite
1
¿Funcionará esto si el origen está realmente por delante? como en, ¿puedo usarlo también si no tengo confirmaciones por delante y, de hecho, la rama se puede reenviar rápidamente?
Jared Forsyth
1
¡Gracias! Lo hizo parecer fácil.
sholsinger
137

Puede usar la respuesta del enlace duplicado señalado por nvm.

O puede resolver conflictos utilizando sus cambios (pero algunos de sus cambios podrían mantenerse si no entran en conflicto con la versión remota):

git pull -s recursive -X theirs
Antoine Pelisse
fuente
3
No parece estar funcionando para mí. Obtengo "error: interruptor desconocido 'X'" usando git git versión 1.5.6.5. ¿Necesito actualizar a una versión inestable?
David Tuite
Además, Antoine, si quieres tomar la versión original de todo, no solo el contenido en conflicto, puedes ... mira mi respuesta.
Cascabel
2
@David Puede obtener una versión reciente de git para debian en backports.debian.org
Arrowmaster
2
¡Esto es exactamente lo que estaba buscando!
micahblu
2
@CeesTimmerman No es cierto, al menos en el último git. XLa opción se pasa a la estrategia de combinación, que es solo recursivesi se combinan dos cabezas, por lo que su comando se quejará "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree.", es una pena, porque Xse puede configurar en la configuración (por ejemplo git config pull.twohead theirs) pero sno se puede.
OJFord