101 votes

Commande Git pour vérifier toute branche et écraser les modifications locales

Y a-t-il une commande Git (ou une courte séquence de commandes) qui fera en toute sécurité et sûreté ce qui suit ?

  • Se débarrasser de toutes les modifications locales.
  • Récupérer la branche donnée depuis l'origine si nécessaire
  • Passer à la branche donnée ?

Actuellement, je suis bloqué avec :

git fetch -p
git stash
git stash drop
git checkout $branch
git pull

mais cela me dérange car on me demande le mot de passe deux fois (par fetch et pull). En général, je serais content avec n'importe quelle solution tant que le mot de passe n'est requis qu'une seule fois.

Quelques remarques :

  • C'est une partie d'un script de déploiement fait maison pour une application (le code est hébergé sur GitHub).
  • Il ne devrait pas y avoir de différence si la branche a déjà été récupérée depuis l'origine ou non (c'est-à-dire que le premier déploiement d'une nouvelle branche ne devrait idéalement nécessiter aucune étape supplémentaire).
  • Le script est situé sur une machine distante à laquelle plusieurs personnes peuvent accéder, donc aucune information d'identification n'est stockée et l'utilisateur/mot de passe doit être entré (mais seulement une fois si possible).
  • Je ne me préoccupe pas des modifications locales ; je veux toujours une copie vierge de la branche donnée (la partie ultérieure du script de déploiement produit des modifications locales).
  • Je ne peux pas cloner ou exporter un nouveau dépôt à chaque fois ; cela prend trop de temps.

147voto

VonC Points 414372

Vous pourriez suivre une solution similaire à "Comment forcer un "git pull" à écraser les fichiers locaux ?":

git fetch --all
git reset --hard origin/abranch
git checkout abranch 

Cela ne nécessiterait qu'une seule récupération.

Avec Git 2.23+, git checkout est remplacé ici par git switch (présenté ici) (encore expérimental).

git switch -f $branch

(avec -f étant un alias pour --discard-changes, comme indiqué dans la réponse de Jan sur Stack Overflow)

Procédez même si l'index ou l'arborescence de travail diffère de HEAD.
L'index et l'arborescence de travail sont tous deux restaurés pour correspondre à la cible de changement.


Si vous ne souhaitez pas changer de branche, mais simplement restaurer un dossier d'une autre branche, alors git restore est l'autre commande qui remplace l'ancienne et confuse commande git checkout.
J'ai présenté git restore ici.

git restore --source=anotherBranch --staged] [--worktree -- aFolder
# ou, plus court :
git restore -s anotherBranch -SW -- aFolder

39voto

Marcin Łoś Points 1802

Couple of points:

  • I believe git stash + git stash drop could be replaced with git reset --hard
  • ... ou, encore plus court, ajouter -f à la commande checkout:

    git checkout -f -b $branch

    Cela permettra de supprimer toutes les modifications locales, tout comme si git reset --hard avait été utilisé avant le checkout.

Quant à la question principale: au lieu de tirer dans la dernière étape, vous pourriez simplement fusionner la branche appropriée depuis le distant dans votre branche locale: git merge $branch origin/$branch, je crois que cela n'impacte pas le distant. Si c'est le cas, cela élimine le besoin de crédentials et donc, répond à votre plus grande préoccupation.

14voto

Aaron Hull Points 83

git reset et git clean peuvent être exagérés dans certaines situations (et être une énorme perte de temps).

Si vous avez simplement un message comme "Les fichiers non suivis suivants seraient écrasés..." et que vous voulez que le distant/origine/amont écrase ces fichiers non suivis en conflit, alors git checkout -f est la meilleure option.

Si vous êtes comme moi, votre autre option était de nettoyer et d'effectuer un --hard reset, puis de recompiler votre projet.

3voto

Jan Points 88

Le nouveau git-switch commande (à partir de GIT 2.23) a également un drapeau --discard-changes qui devrait vous aider. git pull pourrait être nécessaire par la suite.

Avertissement : cela est toujours considéré comme expérimental.

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