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?
@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.
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:
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).
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
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'
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.
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.
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
rm -rf local_repo && git clone remote_url
.Réponses:
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:
S'il existe des fichiers locaux non suivis, vous pouvez les utiliser
git clean
pour les supprimer. Permetgit clean -f
de supprimer les fichiers non suivis,-df
de supprimer les fichiers et répertoires non-xdf
suivis 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:
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.
la source
git reset
vos fichiers diffèrent encore de la télécommande, lisez stackoverflow.com/questions/1257592/…git reset --hard
affecte 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.Pour moi, ce qui suit a fonctionné:
(1) Commencez par récupérer toutes les modifications:
(2) Réinitialisez ensuite le maître:
(3) Pull / mise à jour:
la source
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 (commegit reclone
ougit sync
), ni svn ne fournit une telle commande (commesvn recheckout
ousvn sync
).Essayez la commande suivante:
la source
git clean -fxd
supprime également les fichiers.gitignore
.La commande ci-dessous ne fonctionnera pas toujours . Si vous faites juste:
etc...
Pour vraiment recommencer, télécharger la branche et écraser toutes vos modifications locales, faites simplement:
Cela fonctionnera très bien.
la source
la source
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.
la source
Si vous êtes sous Linux:
La boucle for supprimera tous les fichiers suivis qui sont modifiés dans le référentiel local, donc
git pull
fonctionnera 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.
la source
le moyen le plus court de le faire est:
la source
--autostash
avant, merci!cela a fonctionné pour moi
avec la réponse acceptée, j'obtiens des erreurs de conflit
la source
Je fais habituellement:
Dans le dossier racine du projet.
la source
Cela va récupérer la branche actuelle et tenter de faire une avance rapide vers le master:
la source
.gitignore
"L'ajout de fichiers indésirables à .gitignore fonctionne tant que vous ne les avez initialement pas engagés dans une branche."
Vous pouvez également exécuter:
https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html
la source