Risolvi i conflitti usando le modifiche remote quando si estrae da Git Remote


297

Sto cercando di estrarre il codice dal mio repository GitHub sul mio server, ma l'estrazione continua a fallire a causa di conflitti di unione. Non voglio conservare nessuna delle modifiche che potrebbero essersi verificate sul mio server locale dall'ultimo pull.

Quindi c'è un modo in cui posso forzare Git a sovrascrivere con qualunque versione di GitHub, piuttosto che preoccuparmi dei conflitti?



4
@nvm: No. Si tratta di conflitti di unione reale, non di file non tracciati che verrebbero sovrascritti.
Cascabel,

Risposte:


491

Se vuoi veramente scartare i commit che hai fatto localmente, cioè non averli mai più nella storia, non stai chiedendo come tirare - pull significa unire e non devi unirti. Tutto quello che devi fare è questo:

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

Consiglio personalmente di creare prima un ramo di backup nell'attuale HEAD, in modo che se ti rendi conto che questa è stata una cattiva idea, non ne hai perso traccia.

Se, d'altra parte, vuoi mantenere tali commit e far sembrare che ti sia fuso con origin, e far sì che l'unione mantenga solo le versioni dall'origine, puoi usare la oursstrategia di unione:

# 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

1
Nel secondo blocco di comandi git c'è .. dovrebbe esserci un 'git fetch origin' dopo il secondo comando?
David Tuite,

@ David: Sì, dovresti recuperare dall'origine ad un certo punto. Mi dispiace, l'ho considerato implicito.
Cascabel,

2
Non c'è nulla che possa essere lasciato implicito quando si tratta di me e git ;-). Seriamente, grazie mille. La tua risposta è esattamente quello che stavo cercando.
David Tuite,

1
Funzionerà se l'origine è effettivamente avanti? come in, posso usarlo anche se non ho alcun commit in anticipo e in effetti la filiale può essere anticipata?
Jared Forsyth,

1
Grazie! Mi è sembrato facile.
sholsinger,

137

Puoi utilizzare la risposta dal link duplicato indicato da NVV.

Oppure puoi risolvere i conflitti usando le loro modifiche (ma alcune delle tue modifiche potrebbero essere mantenute se non sono in conflitto con la versione remota):

git pull -s recursive -X theirs

3
Non sembra funzionare per me. Ottengo "errore: switch sconosciuto" X "usando git git versione 1.5.6.5. Devo passare a una versione instabile?
David Tuite,

Inoltre, Antoine, se vuoi prendere la versione di origine di tutto, non solo dei contenuti in conflitto, puoi - vedi la mia risposta.
Cascabel,

2
@David Puoi ottenere una versione recente di git per debian da backports.debian.org
Arrowmaster,

2
Questo e 'esattamente quello che stavo cercando!
micahblu,

2
@CeesTimmerman Non è vero, almeno negli ultimi git. Xviene passata l'opzione per unire la strategia, che è solo recursivese si uniscono due teste, quindi il comando si lamenterà "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree.": è un peccato, perché Xpuò essere impostato in config (ad esempio git config pull.twohead theirs) ma snon può.
OJFord,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.