git remplace la version locale par la version distante

148

Comment puis-je dire à git d'ignorer mon fichier local et de prendre celui de ma branche distante sans essayer de fusionner et de provoquer des conflits?

Ryudice
la source
1
Voir la réponse SO " commande git pour créer une branche comme une autre " pour toutes les méthodes de simulation actuellesgit merge -s their .
VonC
Il serait utile que vous fournissiez plus de détails. Voulez-vous adopter le contenu de tous les fichiers de la branche distante, ou seulement certains des fichiers (c'est-à-dire conserver certaines versions / modifications locales)? Avez-vous une histoire locale que vous souhaitez conserver? (Cela peut être important s'il existe d'autres succursales ou référentiels qui ont déjà incorporé votre histoire locale.) Si vous souhaitez conserver votre histoire locale, que prévoyez-vous d'en faire plus tard? (Vous pouvez laisser une balise pointant vers l'historique local et simplement réinitialiser votre branche à ce que la télécommande a, ou vous pourriez vouloir «fusionner la leur»).
Chris Johnsen

Réponses:

169

C'est la solution la plus sûre:

git stash

Vous pouvez désormais faire ce que vous voulez sans craindre les conflits.

Par exemple:

git checkout origin/master

Si vous souhaitez inclure les modifications à distance dans la branche principale, vous pouvez faire:

git reset --hard origin/master

Cela vous fera brancher "master" pour pointer vers "origin / master".

Olivier Verdier
la source
90
Cela vaut peut-être la peine de souligner que cela détachera HEAD - le questionneur préférera peut-être rester sur la branche avecgit stash; git fetch origin; git reset --hard origin/master
Mark Longair
10
Je pense que le commentaire de Mark Longair est la réponse réelle à cette question
cela a été la réponse la plus utile pour moi +1
Andres
Comment revenir à l'état d'avant le git stash? git stash listest vide.
Leo
Je veux te faire un câlin
Ugur Kazdal
45

Je comprends la question comme ceci: vous voulez remplacer complètement le contenu d'un fichier (ou d'une sélection) en amont. Vous ne voulez pas affecter directement l'index (vous passerez donc par add + commit comme d'habitude).

Faites simplement

git checkout remote/branch -- a/file b/another/file

Si vous souhaitez faire cela pour des sous-arbres étendus et que vous souhaitez à la place affecter directement l'index, utilisez

git read-tree remote/branch:subdir/

Vous pouvez ensuite (éventuellement) mettre à jour votre copie de travail en faisant

git checkout-index -u --force
sehe
la source
2
C'est exactement ce que je voulais. Merci.
AutonomousApps
11

Je crois comprendre que, par exemple, vous avez enregistré à tort un fichier que vous aviez mis à jour à des fins de test uniquement. Ensuite, lorsque vous exécutez "git status", le fichier apparaît comme "Modified" et vous dites quelques mots grossiers. Vous voulez simplement récupérer l'ancienne version et continuer à fonctionner normalement.

Dans ce scénario, vous pouvez simplement exécuter la commande suivante:

git checkout -- path/filename
Almir Campos
la source
10

Je retirerais le fichier distant du "master" (le référentiel distant / d'origine) comme ceci:

git checkout master <FileWithPath>

Exemple: git checkout master components / indexTest.html

Birol Efe
la source
Pour moi a fonctionné comme ceci "git checkout remotes / origin / master <my-file>"
saravanakumar
4

Utilisez l' option -sou --strategycombinée à l' -Xoption. Dans votre question spécifique, vous souhaitez conserver tous les fichiers distants et remplacer les fichiers locaux du même nom.

Remplacez les conflits par la version distante

git merge -s recursive -Xtheirs upstream/master  

utilisera la version du référentiel distant de tous les fichiers en conflit.

Remplacez les conflits par la version locale

git merge -s recursive -Xours upstream/master

utilisera la version du référentiel local de tous les fichiers en conflit.

csi
la source