9472 votes

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

Comment puis-je forcer l'écrasement des fichiers locaux sur un ordinateur de type git pull ? Mon référentiel local contient un fichier portant le même nom que sur le serveur.

erreur : Le fichier 'example.txt' de l'arbre de travail non suivi serait écrasé par la fusion.

45 votes

Si quelqu'un qui lit ceci pense qu'il pourrait perdre des fichiers, j'ai été dans cette position et j'ai trouvé que la mémoire tampon de Sublime Text m'a sauvé - si je travaille sur quelque chose, puis que je supprime accidentellement tout en essayant de résoudre un problème similaire à celui-ci ou en utilisant une réponse à cette question et que j'ai eu les fichiers ouverts dans Sublime (ce qui est fort probable), alors les fichiers seront toujours là dans Sublime, soit juste là, soit dans l'historique d'annulation.

297 votes

git reset --hard origin/branch_to_overwrite

4 votes

En gros, ne faites un pull depuis develop qu'après le checkout initial -b. faites votre travail, puis repoussez-le.

13037voto

RNA Points 19596

Attention :

Tout changement local non engagé dans les fichiers suivis sera perdu.

Tous les fichiers locaux qui sont no suivies par Git ne seront pas affectées.


D'abord, mettez à jour tous les origin/<branch> réf. au plus récent :

git fetch --all

Sauvegarde de votre branche actuelle (par ex. master ) :

git branch backup-master

Passez à la dernière livraison sur origin/master et extraire ces fichiers :

git reset --hard origin/master

Explication :

git fetch télécharge la dernière version à distance sans essayer de fusionner ou de rebaser quoi que ce soit.

git reset réinitialise la branche principale à ce que vous venez de récupérer. Le site --hard modifie tous les fichiers de votre arborescence de travail pour qu'ils correspondent à ceux de l'option origin/master .


Maintenir les commits locaux actuels

[*] : Il convient de noter qu'il est possible de maintenir les commits locaux actuels en créant une branche à partir de master avant la réinitialisation :

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 le fichier new-branch-to-save-current-commits .

Changements non engagés

Les changements non engagés, cependant (même mis en scène), seront perdus. Assurez-vous de mettre en cache et de commiter tout ce dont vous avez besoin. Pour cela, vous pouvez exécuter ce qui suit :

git stash

Et ensuite pour réappliquer ces changements non engagés :

git stash pop

34 votes

Attention ! Si vous avez des commits locaux non poussés, cela les supprimera de votre branche ! Cette solution garde intacts les fichiers non suivis qui ne sont pas dans le référentiel, mais écrase tout le reste.

562 votes

Il s'agit d'une question populaire, c'est pourquoi j'aimerais apporter des précisions sur le commentaire le plus élevé ici. Je viens d'exécuter les commandes telles que décrites dans cette réponse et cela n'a pas supprimé TOUS les fichiers locaux. Seuls les fichiers suivis à distance ont été écrasés, et tous les fichiers locaux qui étaient ici ont été laissés intacts.

1 votes

J'ai perdu tous les commits locaux qui n'étaient pas dans le fichier origin/master après un rebasement. Il est très possible de se tirer une balle dans le pied, ici.

1349voto

Travis R Points 8935

Cela va supprimer tous les changements non validés et ensuite tirer :

git reset --hard HEAD
git pull

33 votes

J'ai fait cela et certains fichiers locaux qui n'étaient plus dans le repo sont restés sur le disque.

41 votes

Je ne pense pas que cela soit correct. Ce qui précède effectuera une fusion, pas un écrasement, ce qui était demandé dans la question : "Comment forcer git à les écraser ?" Je n'ai pas la réponse, je suis en train de la chercher pour le moment je passe à la branche avec le code que je veux garder "git checkout BranchWithCodeToKeep", puis je fais "git branch -D BranchToOverwrite" et enfin "git checkout -b BranchToOverwrite". vous aurez maintenant le code exact de BranchWithCodeToKeep sur la branche BranchToOverwrite sans avoir à effectuer une fusion.

306 votes

Au lieu de fusionner en utilisant 'git pull', essayez git fetch --all suivi de 'git reset --hard origin/master'.

592voto

David Avs Points 2105

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


Parfois juste clean -f n'est pas utile. Si vous avez des répertoires non suivis, l'option -d est également nécessaire :

# WARNING: this can't be undone!

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

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

Envisagez d'utiliser -n ( --dry-run ) en premier. Cela vous montrera ce qui sera supprimé sans que rien ne soit réellement supprimé :

git clean -n -f -d

Exemple de sortie :

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...

1 votes

Vous pouvez donner à git clean un argument de chemin pour être plus spécifique et éviter de supprimer les fichiers non suivis qui ne sont pas en conflit.

7 votes

Je pense que la description du scénario montre clairement qu'il ne veut pas vraiment jeter le contenu. Ce qu'il veut plutôt, c'est empêcher git d'écraser les fichiers. @Lauri, cela n'aurait pas dû vous arriver. Malheureusement, les gens semblent avoir mal interprété l'essence de la description du scénario - voir ma suggestion.

25 votes

ENFIN . git clean -f -d est pratique lorsque make clean ne parvient pas à tout nettoyer.

487voto

Buildrr LLC Points 1097

Comme Hedgehog, je pense que les réponses sont terribles. Mais bien que la réponse de Hedgehog soit meilleure, je ne pense pas qu'elle soit aussi élégante qu'elle pourrait l'être. Le moyen que j'ai trouvé pour faire cela est d'utiliser fetch y merge avec une stratégie définie. Ce qui devrait faire en sorte que vos modifications locales soient préservées tant qu'elles ne font pas partie des fichiers avec lesquels vous essayez de forcer un écrasement.

Faites d'abord un commit de vos changements

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

Ensuite, récupérez les changements et écrasez-les 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 theirs est la valeur de cette option. Vous choisissez d'utiliser their (l'autre option est ours changements) s'il y a un conflit.

75 votes

C'est la meilleure réponse que j'ai vue jusqu'à présent. Je ne l'ai pas encore essayée, mais contrairement aux autres réponses, elle ne tente pas de détruire tous vos fichiers non suivis, ce qui est très dangereux pour des raisons évidentes.

8 votes

Idem - cela a fonctionné pour moi lorsque j'ai fait une très grande fusion (demande de retrait GitHub) où je voulais juste tout accepter en plus de ce que j'avais. Bonne réponse ! Dans mon cas, les deux dernières commandes étaient : 1) get fetch other-repo ; 2) git merge -s recursive -X theirs other-repo/master

4 votes

Cela écrasera tout conflit avec les fichiers des dépôts et non avec vos fichiers locaux, correct ?

420voto

Johanneke Points 1099

Au lieu de faire :

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

Je vous conseille de faire ce qui suit :

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

Il n'est pas nécessaire de récupérer toutes les branches et les branches distantes si vous allez réinitialiser à la branche d'origine/maître, n'est-ce pas ?

3 votes

Votre réponse est exactement ce dont vous aviez besoin pour votre représentant. Je dois demander, est-ce que cela supprime aussi tous les fichiers non tracés ?

6 votes

Ouais, la plupart de ma réputation vient d'ici :) Cela va également supprimer tous les fichiers non suivis. Quelque chose que j'avais oublié et qui m'a été douloureusement rappelé il y a seulement 2 jours...

1 votes

Voir les commentaires sur cette autre réponse : stackoverflow.com/a/8888015/2151700

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X