Git Pull tout en ignorant les changements locaux?

489

Existe-t-il un moyen de faire un git pullqui ignore toutes les modifications de fichiers locaux sans faire sauter le répertoire et sans avoir à effectuer un git clone?

markdorison
la source
17
Par «ignore», voulez-vous dire «écrase»?
Cascabel
@Cascabel Cela signifie annuler toutes les modifications locales, annuler tous les commits locaux, supprimer tous les nouveaux fichiers et répertoires locaux, annuler la suppression de tous les fichiers et répertoires supprimés localement, etc. En bref, il suffit d'exécuter une commande comme si rm -rf local_repo && git clone remote_url.
Victor

Réponses:

820

Si vous voulez dire que vous voulez que l'écrasement écrase les modifications locales, en faisant la fusion comme si l'arbre de travail était propre, eh bien, nettoyez l'arbre de travail:

git reset --hard
git pull

S'il existe des fichiers locaux non suivis, vous pouvez les utiliser git cleanpour les supprimer. Permet git clean -fde supprimer les fichiers non suivis, -dfde supprimer les fichiers et répertoires non -xdfsuivis et de supprimer les fichiers ou répertoires non suivis ou ignorés.

Si, d'autre part, vous souhaitez conserver les modifications locales d'une manière ou d'une autre, vous devez utiliser la cachette pour les cacher avant de les tirer, puis les réappliquer ensuite:

git stash
git pull
git stash pop

Je ne pense pas que cela ait un sens d' ignorer littéralement les changements, cependant - la moitié de la traction est la fusion, et il doit fusionner les versions validées du contenu avec les versions qu'il a récupérées.

Cascabel
la source
4
Si après que git resetvos fichiers diffèrent encore de la télécommande, lisez stackoverflow.com/questions/1257592/…
Colonel Panic
3
Git est la chose la plus étrange qui soit. Git reset --hard done. Puis git status: votre branche est en avance de 2 commits.
Shailen
21
@shailenTJ "Modifications locales" signifie ici des modifications non validées, pas des validations locales. git reset --hardaffecte les premiers, pas les seconds. Si vous souhaitez réinitialiser complètement l'état de la télécommande, git reset --hard origin/<branch>- mais souvent et dans ce cas, ces deux validations que vous êtes en avance sur votre travail sont des tâches que vous avez faites, pas quelque chose que vous souhaitez jeter.
Cascabel
2
Donc, c'est la même chose que de détruire le référentiel local et de re-télécharger, non? Je veux juste pouvoir forcer les changements de traction et d'écrasement pour plus de commodité. 99% du temps, je reçois ce message d'erreur lorsque j'ai accidentellement gâché quelque chose localement et que je veux juste recommencer à partir du dépôt.
sudo
Et si vous ne pouvez pas avoir de changement local par rapport à la tête? Par exemple, le dépôt a été effectué sur un système de fichiers sensible à la casse et est cloné sur un système de fichiers insensible à la casse et il y a 2 fichiers avec le même boîtier différent?
xster
305

Pour moi, ce qui suit a fonctionné:

(1) Commencez par récupérer toutes les modifications:

$ git fetch --all

(2) Réinitialisez ensuite le maître:

$ git reset --hard origin/master

(3) Pull / mise à jour:

$ git pull
Artur Barseghyan
la source
22
A très bien fonctionné pour moi quand j'ai eu beaucoup de problèmes avec la réponse du haut. Merci!
0x0
6
cela fonctionne même lorsque vous avez engagé des changements locaux, mais vous voulez toujours revenir
agsachin
16
Cela devrait être la meilleure réponse :)
Purus
5
@Marco Servetto: Vous récupérez d'abord toutes vos modifications git, mais ne les appliquez pas encore. Ensuite, vous réinitialisez le maître dans le dernier état (mis à jour). Si vous sautez la première étape, vous reviendrez les modifications apportées à l'ancien maître (local). D'après mon expérience, la façon dont je l'ai décrite, ne cause jamais de problèmes. Toutes les autres tentatives le font à la fin.
Artur Barseghyan
1
Cela a fonctionné pour moi, je voulais ignorer toutes mes modifications locales, y compris la récupération des fichiers supprimés
Neri
28

Vous voulez juste une commande qui donne exactement le même résultat que rm -rf local_repo && git clone remote_url, non? Je veux aussi cette fonctionnalité. Je me demande pourquoi git ne fournit pas une telle commande (comme git recloneou git sync), ni svn ne fournit une telle commande (comme svn recheckoutou svn sync).

Essayez la commande suivante:

git reset --hard origin/master
git clean -fxd
git pull
Victor
la source
C'est ce qui fonctionne vraiment, même lorsque vous avez déjà des commits locaux que vous souhaitez supprimer.
Yuri Ghensev
5
Attention les gars !! git clean -fxdsupprime également les fichiers .gitignore.
Ramesh Navi
@RameshNavi Sure. C'est exactement ce que l'on souhaite. Ce que l'on veut, c'est avoir un moyen plus rapide de le recloner, c'est-à-dire de supprimer l'intégralité du référentiel local puis de le cloner.
Victor
27

La commande ci-dessous ne fonctionnera pas toujours . Si vous faites juste:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

etc...

Pour vraiment recommencer, télécharger la branche et écraser toutes vos modifications locales, faites simplement:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Cela fonctionnera très bien.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'
Dr Beco
la source
4
OUI. C'est ce dont j'avais besoin pour une approche ultime "ne donnez pas un F sur ce qui est local". Merci. :)
Adambean
10
git fetch --all && git reset --hard origin/master
Luca C.
la source
8

Regardez git stash pour mettre toutes vos modifications locales dans un "fichier stash" et revenir au dernier commit. À ce stade, vous pouvez appliquer vos modifications cachées ou les supprimer.

Seth Johnson
la source
8

Si vous êtes sous Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

La boucle for supprimera tous les fichiers suivis qui sont modifiés dans le référentiel local, donc git pullfonctionnera sans aucun problème.
La chose la plus agréable à ce sujet est que seuls les fichiers suivis seront écrasés par les fichiers du dépôt, tous les autres fichiers resteront intacts.

Strahinja Kustudic
la source
Je pense que vous vouliez dire "fichiers suivis", c'est exactement ce dont j'ai besoin, merci.
Ali
un équivalent pour Powershell?
Earlee
8

le moyen le plus court de le faire est:

git pull --rebase --autostash
gil
la source
ne savait pas --autostashavant, merci!
shiro
7

cela a fonctionné pour moi

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

avec la réponse acceptée, j'obtiens des erreurs de conflit

Pablo Pazos
la source
C'est très similaire à la réponse 2015 d'Artur Barseghyan ... mais j'aimerais quand même savoir quel est le but de la 3e commande: les fichiers de travail ont changé après la 2e commande, et la 3e commande dit "Déjà à jour "
mike rodent
c'est la seule combinaison qui a fonctionné dans mon environnement, peut-être que vous voyez une chose différente, pour moi, j'avais besoin des trois commandes
Pablo Pazos
Intéressant. Ça pourrait être une version. Je suis sur git 2.7.4. Mais je viens également de voir un nouveau commentaire d'Artur Barseghyan: "Sinon, vous pourriez vous retrouver à travailler sur un maître accidentellement obsolète."
mike rodent
peut-être, mais la seule chose que je peux dire est "cela a fonctionné pour moi quand aucune autre solution ne l'a fait", donc cela pourrait aider les autres
Pablo Pazos
3

Je fais habituellement:

git checkout .
git pull

Dans le dossier racine du projet.

Cassiano Franco
la source
2

Cela va récupérer la branche actuelle et tenter de faire une avance rapide vers le master:

git fetch && git merge --ff-only origin/master
Petah
la source