Question Comment forcer "git pull" à écraser les fichiers locaux?


Comment forcer un écrasement de fichiers locaux sur un git pull?

Le scénario est le suivant:

  • Un membre de l'équipe modifie les modèles d'un site Web sur lequel nous travaillons
  • Ils ajoutent des images dans le répertoire des images (mais oublient de les ajouter sous le contrôle de la source)
  • Ils envoient les images par mail, plus tard, à moi
  • J'ajoute les images sous le contrôle de la source et je les pousse à GitHub avec d'autres changements
  • Ils ne peuvent pas tirer de mises à jour de GitHub parce que Git ne veut pas écraser leurs fichiers.

C'est l'erreur que j'obtiens:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

Comment forcer Git à les écraser? La personne est un concepteur - habituellement, je résous tous les conflits à la main, de sorte que le serveur a la version la plus récente qu'ils ont juste besoin de mettre à jour sur leur ordinateur.


5198
2017-07-14 14:58


origine


Réponses:


Important: Si vous avez des changements locaux, ils seront perdus. Avec ou sans --hard option, tous les commits locaux qui n'ont pas été poussés seront perdus.[*]

Si vous avez des fichiers qui sont ne pas suivis par Git (par exemple, le contenu de l'utilisateur téléchargé), ces fichiers ne seront pas affectés.


Je pense que c'est la bonne façon:

git fetch --all

Ensuite, vous avez deux options:

git reset --hard origin/master

OU Si vous êtes dans une autre branche:

git reset --hard origin/<branch_name>

Explication:

git fetch télécharge le dernier depuis la télécommande sans essayer de fusionner ou de rebaser quoi que ce soit.

Puis le git reset réinitialise la branche principale à ce que vous venez d'extraire. le --hard option modifie tous les fichiers dans votre arbre de travail pour faire correspondre les fichiers dans origin/master


Maintenir les validations locales actuelles

[*]: Il est à noter qu'il est possible de maintenir les validations locales actuelles en créant une branche depuis master avant de réinitialiser:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Après cela, tous les anciens commits seront conservés dans new-branch-to-save-current-commits.

Modifications non validées

Cependant, les modifications non validées (même mises en scène) seront perdues. Assurez-vous de stocker et de commettre tout ce dont vous avez besoin. Pour cela, vous pouvez exécuter ce qui suit:

git stash

Puis, pour réappliquer ces modifications non validées:

git stash pop

7275
2018-01-17 00:02



Essaye ça:

git reset --hard HEAD
git pull

Cela devrait faire ce que vous voulez.


761
2018-05-09 19:45



ATTENTION: git clean supprime tous vos fichiers / répertoires non suivis et ne peut pas être annulé.


Parfois juste clean -f n'aide pas. Si vous avez des ANNUAIRES non suivies, l'option -d est également nécessaire:

git reset --hard HEAD
git clean -f -d
git pull

ATTENTION: git clean supprime tous vos fichiers / répertoires non suivis et ne peut pas être annulé.


381
2018-03-19 09:10



Comme Hedgehog, je pense que les réponses sont terribles. Mais même si la réponse de Hedgehog pourrait être meilleure, je ne pense pas qu'elle soit aussi élégante qu'elle pourrait l'être. La façon dont j'ai trouvé cela est en utilisant "fetch" et "fusionner" avec une stratégie définie. Ce qui devrait faire en sorte que vos changements locaux soient conservés tant qu'ils ne sont pas un des fichiers avec lesquels vous essayez de forcer un écrasement.

Commencez par valider vos modifications

 git add *
 git commit -a -m "local file server commit message"

Ensuite, récupérez les modifications et remplacez s'il y a un conflit

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-X" est un nom d'option, et "leur" est la valeur de cette option. Vous choisissez d'utiliser "leurs" changements, au lieu de "vos" changements s'il y a un conflit.


334
2018-04-11 20:13



Au lieu de faire:

git fetch --all
git reset --hard origin/master

Je conseillerais de faire ce qui suit:

git fetch origin master
git reset --hard origin/master

Pas besoin d'aller chercher toutes les télécommandes et les branches si vous allez réinitialiser à la branche origine / maître droit?


237
2018-04-26 13:48



Il semble que la meilleure façon est de faire d'abord:

git clean

Pour supprimer tous les fichiers non suivis et continuer avec l'habituel git pull...


121
2017-07-14 15:16



Attention, cela supprimera définitivement vos fichiers si vous avez des entrées de répertoire / * dans votre fichier gitignore.

Certaines réponses semblent être terribles. Terrible dans le sens de ce qui est arrivé à @Lauri en suivant la suggestion de David Avsajanishvili.

Plutôt (git> v1.7.6):

git stash --include-untracked
git pull

Plus tard, vous pouvez nettoyer l'historique de stockage.

Manuellement, un par un:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Brutalement, tout-en-un:

$ git stash clear

Bien sûr, si vous voulez revenir à ce que vous avez caché:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



Vous pourriez trouver cette commande utile pour éliminer les modifications locales:

git checkout <your-branch> -f

Et puis effectuez un nettoyage (supprime les fichiers non suivis de l'arborescence de travail):

git clean -f

Si vous souhaitez supprimer les répertoires non suivis en plus des fichiers non suivis:

git clean -fd

86
2017-08-05 18:06



Au lieu de fusionner avec git pull, essaye ça:

git fetch --all

suivi par:

git reset --hard origin/master.


72
2017-11-22 10:56