Comment faire pour que git pull écrase les fichiers locaux?

Comment écraser de force les fichiers locaux dans git pull ?

Le script est le suivant:

  • Un membre de l'équipe modifie les modèles du site sur lequel nous travaillons.
  • Ils ajoutent des images au catalogue d'images (mais oublient de les ajouter sous le contrôle du code source)
  • Ils m'envoient des images plus tard par courrier
  • J'ajoute des images sous le contrôle du code source et les mets sur GitHub avec d'autres modifications.
  • Ils ne peuvent pas recevoir de mises à jour de GitHub car Git ne veut pas écraser leurs fichiers.

C'est l'erreur que j'obtiens:

erreur: le fichier d'arbre de travail non suivi 'public / images / icon.gif' sera écrasé par la fusion

Comment faire en sorte que Git les écrase? Cette personne est un designer. En général, je résous tous les conflits manuellement, de sorte que la dernière version est installée sur le serveur, qu’ils doivent simplement mettre à jour sur leur ordinateur.

5705
14 июля '09 в 17:58 2009-07-14 17:58 demandé par Jakub Troszok le 14 juillet 09 à 17:58 2009-07-14 17:58
@ 39 réponses
  • 1
  • 2

Important: si vous avez des modifications locales, elles seront perdues. Avec l'option --hard ou sans --hard tous les commits locaux qui n'ont pas été transmis seront perdus. [*]

Si vous avez des fichiers qui ne sont pas suivis par Git (par exemple, le contenu 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 les dernières données d'un ordinateur distant, sans essayer de fusionner ou de déplacer quoi que ce soit.

Ensuite, git reset réinitialise la branche principale à ce que vous venez de recevoir. L'option --hard change tous les fichiers de votre arbre de travail en fonction des fichiers dans origin/master


Maintenir les commits locaux actuels

[*] : Il est à noter que vous pouvez enregistrer les commits locaux actuels en créant une branche à partir du master afin 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 stockés dans new-branch-to-save-current-commits .

Changements en attente

Cependant, les modifications non corrigées (même en phase) seront perdues. Assurez-vous de cacher et de transmettre tout ce dont vous avez besoin. Pour ce faire, vous pouvez exécuter les opérations suivantes:

 git stash 

Et réappliquez ensuite ces modifications non validées:

 git stash pop 
7980
17 янв. la réponse est donnée au RNA le 17 janvier. 2012-01-17 03:02 '12 à 3:02 2012-01-17 03:02

Essayez ce qui suit:

 git reset --hard HEAD git pull 
border=0

Il doit faire ce que tu veux.

798
09 мая '10 в 22:45 2010-05-09 22:45 a répondu à Travis Reeder le 09 mai 2010 à 22h45 2010-05-09 22:45

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


Parfois, simplement clean -f n'aide pas. Si vous n'avez pas de répertoires suivis, l'option -d est également nécessaire:

 # WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull 

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

Essayez -n utiliser -n ( --dry-run ). Cela vous montrera ce qui sera supprimé sans rien supprimer:

 git clean -n -f -d 

Exemple de sortie:

 Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ... 
406
19 марта '11 в 12:10 2011-03-19 12:10 la réponse est donnée par David Avsajanishvili, le 19 mars 2011 à 12h10. 2011-03-19 12:10

Comme le hérisson, je pense que les réponses sont terribles. Mais bien que la réponse Hérisson puisse être meilleure, je ne pense pas qu’elle soit aussi élégante qu’elle peut l’être. La façon dont j'ai trouvé cela est d'utiliser "échantillonnage" et "fusion" avec une stratégie spécifique. Cela devrait vous assurer que vos modifications locales sont enregistrées jusqu'à ce qu'elles constituent l'un des fichiers que vous essayez d'écraser.

Commencez par valider les modifications.

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

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

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

"- X" est le nom de l'option et "leur" est la valeur de cette option. Vous préférez utiliser "vos" modifications au lieu de "vos" modifications en cas de conflit.

347
11 апр. Réponse donnée par Richard Kersey le 11 avril 2012-04-11 23:13 '12 à 23h13 2012-04-11 23:13

Au lieu de cela:

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

Je conseillerais de faire ce qui suit:

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

Ne pas besoin de prendre toutes les consoles et les branches, si vous allez réinitialiser à l'origine / branche principale sur la droite?

248
26 апр. Johanneke posté le 26 avr 2013-04-26 16:48 '13 à 16:48 2013-04-26 16:48

Il semble que la meilleure chose à faire est la suivante:

 git clean 

Pour supprimer tous les fichiers inutilisés puis continuer avec git pull normal ...

125
14 июля '09 в 18:16 2009-07-14 18:16 la réponse est donnée par Jakub Troszok le 14 juillet 09 à 18:16 2009-07-14 18: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 terribles. Dommage, dans le sens de ce qui est arrivé à @Lauri, à la suite de la suggestion de David Avsadjanishvili.

Plutôt (git> v1.7.6):

 git stash --include-untracked git pull 

Vous pouvez ensuite effacer le cache de l'historique.

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} 

Cruel, tout à la fois:

 $ git stash clear 

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

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. La réponse est donnée par Hedgehog le 12 février. 2012-02-12 02:00 '12 à 2:00 2012-02-12 02:00

Vous pouvez trouver cette commande utile pour supprimer des modifications locales:

 git checkout <your-branch> -f 

Et puis faites le nettoyage (supprime les fichiers bruts de l’arbre de travail):

 git clean -f 

Si vous souhaitez supprimer des répertoires inutiles en plus des fichiers sans trace:

 git clean -fd 
88
05 авг. la réponse est donnée par Vishal 05 aug. 2010-08-05 21:06 '10 à 21:06 2010-08-05 21:06

Au lieu de fusionner avec git pull essayez ceci:

git fetch --all

suivi de:

git reset --hard origin/master .

81
22 нояб. La réponse est donnée par Lloyd Moore le 22 novembre. 2012-11-22 13:56 '12 à 13h56 2012-11-22 13:56

La seule chose qui a fonctionné pour moi a été:

 git reset --hard HEAD~5 

Cela vous donnera cinq commits, puis

 git pull 

J'ai trouvé cela en cherchant comment annuler la fusion de git .

54
06 мая '11 в 0:53 2011-05-06 00:53 la réponse est donnée par Chris BIllante le 06 mai 2011 à 0:53. 2011-05-06 00:53

Le problème de toutes ces solutions est qu’elles sont soit trop complexes, soit encore plus graves: elles suppriment tous les fichiers bruts du serveur Web, ce que nous ne souhaitons pas, car des fichiers de configuration toujours présents sur le serveur sont toujours nécessaires. et pas dans le dépôt git.

Voici la solution la plus propre que nous utilisons:

51
06 нояб. réponse donnée par Strahinja Kustudic nov. 06 2012-11-06 02:32 '12 à 2:32 2012-11-06 02:32

J'ai le même problème. Personne ne m'a donné cette solution, mais cela a fonctionné pour moi.

J'ai décidé ceci:

  1. Supprimer tous les fichiers. Ne laissez que le répertoire .git .
  2. git reset --hard HEAD
  3. git pull
  4. git push

Maintenant ça marche.

38
13 янв. La réponse a été donnée par John John Pichler le 13 janvier. 2011-01-13 02:58 '11 à 2:58 2011-01-13 02:58

Tout d’abord, essayez la méthode standard:

 git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders! 

Attention : les commandes ci-dessus peuvent entraîner une perte de données / fichiers, uniquement si elles ne sont pas corrigées! Si vous n'êtes pas sûr, sauvegardez d'abord l'intégralité de votre dossier de référentiel.

Puis tirez à nouveau.

Si ce qui précède n’aide en rien et que vous n’avez pas besoin de vos fichiers / répertoires non suivis (faites simplement une sauvegarde en premier lieu, au cas où), essayez les étapes simples suivantes:

 cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again 

Cela va supprimer tous les fichiers git (sauf pour .git/ dir, où vous avez tous les commits) et les extraire à nouveau.


Pourquoi git reset HEAD --hard peut ne pas fonctionner dans certains cas?

  1. Règles d'utilisateur dans le .gitattributes file

    La présence de la règle eol eol=lf dans .gitattributes peut amener git à modifier certaines modifications du fichier, en convertissant les fins des lignes CRLF en LF dans certains fichiers texte.

    Si tel est le cas, vous devez valider ces modifications CRLF / LF (en les affichant dans l' git status ) ou essayez: git config core.autcrlf false pour les ignorer temporairement.

  2. Incompatibilité du système de fichiers

    Lorsque vous utilisez un système de fichiers qui ne prend pas en charge les attributs d’autorisation. Par exemple, vous avez deux référentiels, l'un pour Linux / Mac ( ext3 / hfs+ ) et l'autre pour les systèmes de fichiers basés sur FAT32 / NTFS.

    Comme vous l'avez remarqué, il existe deux types de systèmes de fichiers différents. Par conséquent, un système qui ne prend pas en charge les autorisations Unix ne peut pas réinitialiser les autorisations pour les fichiers d'un système qui ne prend pas en charge de telles autorisations. détecte toujours certains "changements".

33
26 окт. la réponse est donnée kenorb 26 oct. 2012-10-26 12:17 '12 à 12:17 2012-10-26 12:17

Bonus:

En parlant de pull / fetch / fusion dans les réponses précédentes, je voudrais partager un tour intéressant et productif:

git pull --rebase

Cette équipe est l’équipe la plus utile de ma vie à Git, ce qui a permis de gagner beaucoup de temps.

Avant d’envoyer votre nouveau commit au serveur, essayez cette commande. Elle synchronisera automatiquement les dernières modifications du serveur (avec fetch + merge) et placera votre commit en haut du journal Git. Pas besoin de s'inquiéter de l'extraction manuelle / fusion.

Trouver des pièces dans Qu'est-ce qui fait "git pull --rebase"? .

31
23 дек. La réponse est donnée par Sazzad Hissain Khan le 23 décembre. 2015-12-23 18:41 '15 à 18:41 2015-12-23 18:41

J'ai résumé les autres réponses. Vous pouvez effectuer git pull sans erreur:

 git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull 

Avertissement Ce script est très puissant, vous pouvez donc perdre vos modifications.

27
07 авг. la réponse est donnée par Robert Moon 07 août. 2015-08-07 06:03 '15 à 6:03 2015-08-07 06:03

J'ai eu un problème similaire. Je devais faire ceci:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. La réponse est donnée par Ryan le 14 janvier. 2011-01-14 18:18 '11 à 18:18 2011-01-14 18:18

Sur la base de mes propres expériences de ce type, la solution proposée par Strahinja Kustudic ci-dessus est de loin la meilleure. Comme d’autres l’ont noté, une simple réinitialisation matérielle supprime tous les fichiers non testés, ce qui peut inclure de nombreux éléments que vous ne souhaitez pas supprimer, tels que les fichiers de configuration. De manière plus sécurisée, il vous suffit de supprimer les fichiers à ajouter et vous souhaitez probablement également rechercher les fichiers modifiés localement qui doivent être mis à jour.

C'est pourquoi j'ai mis à jour le script Kustudic pour faire exactement cela. J'ai aussi corrigé une faute de frappe (manquant à l'original).

26
27 февр. Réponse donnée par Rolf Kaiser le 27 février. 2013-02-27 17:43 '13 à 17:43 2013-02-27 17:43

Je crois qu'il y a deux causes possibles du conflit qui doivent être résolues séparément et, autant que je sache, aucune des réponses ci-dessus ne se rapportent aux deux:

  • Les fichiers locaux qui ne sont pas surveillés doivent être supprimés manuellement (plus sûr) ou, comme suggéré dans d'autres réponses, pour git clean -f -d

  • Les validations locales ne figurant pas dans la branche distante doivent également être supprimées. IMO est le moyen le plus simple d'y parvenir: git reset --hard origin/master (remplacez le "maître" par n'importe quelle branche sur laquelle vous travaillez et lancez d'abord git fetch origin )

23
12 дек. La réponse est donnée au 12 décembre. 2011-12-12 22:54 '11 à 22:54 2011-12-12 22:54

Un moyen plus simple:

 git checkout --theirs /path/to/file.extension git pull origin master 

Cela remplacera votre fichier git local.

20
05 мая '15 в 11:03 2015-05-05 11:03 la réponse est donnée maximus 69 05 Mai '15 à 11:03 2015-05-05 11:03

Il semble que la plupart des réponses ici se concentrent sur la branche principale; Cependant, il arrive parfois que je travaille sur la même branche de fonctions à deux endroits différents, et je veux que l’un d’eux reflète l’un d’eux, sans beaucoup de sauts entre les cerceaux.

Sur la base de la combinaison de la réponse ARN et de la réponse apportée à une question similaire , je trouve un excellent travail:

 git fetch git reset --hard @{u} 

Exécutez-le à partir de la branche, et votre branche locale ne sera réinitialisée que sur la version en amont.

Cela peut être placé commodément dans le git forcepull git ( git forcepull ):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Ou dans le fichier .gitconfig :

 [alias] forcepull = "!git fetch ; git reset --hard @{u}" 

Profiter!

19
25 февр. la réponse est donnée par JacobEvelyn le 25 février 2014-02-25 20:19 14 à 20:19 2014-02-25 20:19

J'ai eu le même problème, et pour une raison quelconque, même git clean -f -d ne ferait pas cela. Voici pourquoi: pour une raison quelconque, si votre fichier est ignoré par Git (via l’entrée .gitignore, je suppose), il craint toujours de l’écraser puis de le déconnecter, mais le réseau ne le supprimera pas, sauf si vous ajoutez -x .

19
03 авг. Répondre Tierlieb 03 aug. 2011-08-03 12:23 '11 à 12:23 2011-08-03 12:23

Je viens de le décider moi-même:

18
03 дек. réponse donnée par Simon B. 03 déc. 2010-12-03 18:00 '10 à 18:00 2010-12-03 18:00

J'ai une situation étrange que ni git clean ni git reset fonctionnent. Je dois supprimer le fichier en conflit de git index utilisant le script suivant pour chaque fichier non suivi:

 git rm [file] 

Ensuite, je peux bien tirer.

17
19 сент. Réponse donnée par Chen Zhang le 19 septembre 2011-09-19 17:18 '11 à 17:18 2011-09-19 17:18

Je connais une méthode beaucoup plus simple et moins douloureuse:

 $ git branch -m [branch_to_force_pull] tmp $ git fetch $ git checkout [branch_to_force_pull] $ git branch -D tmp 

Ça l'est!

16
05 сент. la réponse est donnée à ddmytrenko 05 sep . 2015-09-05 21:23 '15 à 21:23 2015-09-05 21:23

Ces quatre équipes travaillent pour moi.

 git reset --hard HEAD git checkout origin/master git branch -D master git checkout -b master 

Pour vérifier / extraire après avoir exécuté ces commandes

 git pull origin master 

J'ai beaucoup essayé, mais j'ai finalement réussi dans ces équipes.

13
20 марта '14 в 7:24 2014-03-20 07:24 la réponse est donnée par vishesh chandra le 20 mars 2014 à 7:24 2014-03-20 07:24

Malgré la question initiale, les réponses les plus fréquentes peuvent poser problème aux personnes confrontées à un problème similaire, mais ne veulent pas perdre leurs fichiers locaux. Par exemple, voir Commentaires de Al-Punk et crizCraig.

La prochaine version corrige vos modifications locales dans la branche time ( tmp ), vérifie la branche source (qui, je suppose, est la master ) et fusionne les mises à jour. Vous pouvez le faire avec stash , mais j’ai trouvé qu’il était généralement plus facile d’utiliser simplement l’approche branche / fusion.

 git checkout -b tmp git add *; git commit -am "my temporary files" git checkout master git fetch origin master git merge -s recursive -X theirs origin master 

où nous supposons qu'un autre référentiel est origin master .

12
22 окт. La réponse est donnée par Snowcrash le 22 octobre. 2014-10-22 20:31 14 à 20:31 2014-10-22 20:31

Il suffit de le faire

 git fetch origin branchname git checkout -f origin/branchname // This will overwrite ONLY new included files git checkout branchname git merge origin/branchname 

De cette manière, vous évitez tous les effets secondaires indésirables, tels que la suppression de fichiers ou de répertoires que vous souhaitez conserver, etc.

12
19 окт. réponse donnée par l' utilisateur2696128 19 octobre 2015-10-19 12:54 '15 à 12h54 2015-10-19 12h54

Réinitialiser le pointeur et la tête sur origin/master , mais pas réinitialiser l’arbre de travail:

 git reset origin/master 
11
15 февр. La réponse est donnée par user811773 le 15 février. 2013-02-15 16:41 '13 à 16h41 2013-02-15 16:41

Exigences:

  • Suivre les changements locaux, afin que personne ne les perde.
  • Rendre le référentiel local compatible avec le référentiel source distant.

Solution:

  • Masquer les changements locaux.
  • Obtenir des fichiers propres et en ignorant .gitignore et réinitialisation matérielle à l’ origine .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. réponse donnée vezenkov 02 sept. 2015-09-02 02:00 '15 à 2:00 2015-09-02 02:00

J'ai lu toutes les réponses, mais je cherchais une commande pour cela. C'est ce que j'ai fait. Ajout de git alias à .gitconfig

 [alias] fp = "!f(){ git fetch ${1} ${2}  git reset --hard ${1}/${2};};f" 

Lancer la commande

 git fp origin master 

est équivalent à

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 La réponse est donnée par Venkat Kotra le 08 Juillet 2016 à 16:11 2016-07-08 16:11
  • 1
  • 2