Résoudre les conflits à l'aide de modifications à distance lors de l'extraction depuis la télécommande Git

297

J'essaie d'extraire du code de mon référentiel GitHub sur mon serveur, mais l'extraction échoue en raison de conflits de fusion. Je ne veux conserver aucune des modifications qui peuvent s'être produites sur mon serveur local depuis le dernier pull.

Existe-t-il un moyen de forcer Git à écraser avec la version de GitHub, plutôt que de me déranger pour les conflits?

David Tuite
la source
4
@nvm: Non. Il s'agit de vrais conflits de fusion, pas de fichiers non suivis qui seraient écrasés.
Cascabel

Réponses:

491

Si vous voulez vraiment annuler les commits que vous avez faits localement, c'est-à-dire ne plus les avoir dans l'historique, vous ne demandez pas comment tirer - tirer signifie fusionner, et vous n'avez pas besoin de fusionner. Il vous suffit de faire ceci:

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

Je recommanderais personnellement de créer d'abord une branche de sauvegarde sur votre HEAD actuel, de sorte que si vous réalisez que c'était une mauvaise idée, vous ne l'avez pas perdue de vue.

Si, d'autre part, vous souhaitez conserver ces validations et donner l'impression que vous avez fusionné avec l'origine et que la fusion conserve uniquement les versions d'origine, vous pouvez utiliser la oursstratégie de fusion:

# 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
la source
1
Dans le deuxième bloc de commandes git, il devrait y avoir une «origine git fetch» ​​après la deuxième commande?
David Tuite
@David: Oui, vous devriez récupérer l'origine à un moment donné. Désolé, je l'ai considéré comme implicite.
Cascabel
2
Il n'y a rien qui puisse être laissé sous-entendu en ce qui me concerne et git ;-). Sérieusement, merci un million. Vos réponses sont exactement ce que je cherchais.
David Tuite
1
Est-ce que cela fonctionnera si l'origine est réellement en avance? comme dans, puis-je également l'utiliser si je n'ai pas de commit à venir, et en fait la branche peut être accélérée?
Jared Forsyth
1
Merci! Cela a semblé facile.
sholsinger
137

Vous pouvez soit utiliser la réponse du lien en double pointé par nvm.

Ou vous pouvez résoudre les conflits en utilisant leurs modifications (mais certaines de vos modifications peuvent être conservées si elles n'entrent pas en conflit avec la version distante):

git pull -s recursive -X theirs
Antoine Pelisse
la source
3
Ne semble pas fonctionner pour moi. J'obtiens "erreur: commutateur inconnu" X "" en utilisant git git version 1.5.6.5. Dois-je passer à une version instable?
David Tuite
Aussi, Antoine, si vous voulez prendre la version d'origine de tout, pas seulement du contenu en conflit, vous pouvez - voir ma réponse.
Cascabel
2
@David Vous pouvez obtenir une version récente de git pour debian sur backports.debian.org
Arrowmaster
2
Ceci est exactement ce que je cherchais!
micahblu
2
@CeesTimmerman Pas vrai, du moins dans le dernier git. XL'option est passée pour fusionner la stratégie, ce qui n'est que lors de la recursivefusion de deux têtes, donc votre commande se plaindra "Could not find merge strategy 'theirs'. Available strategies are: octopus ours recursive resolve subtree."- c'est dommage, car elle Xpeut être définie dans config (par exemple git config pull.twohead theirs) mais sne peut pas.
OJFord