web-dev-qa-db-fra.com

Commande Git pour extraire toute branche et écraser les modifications locales

Existe-t-il une commande Git (ou une courte séquence de commandes) qui effectuera les opérations suivantes en toute sécurité?

  • Débarrassez-vous de tout changement local.
  • Récupère la branche donnée chez Origin si nécessaire
  • Commander la branche donnée?

Actuellement, je suis coincé avec:

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

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

Quelques notes:

  • C'est une partie du script de déploiement homebrewed pour une application (le code est hébergé sur GitHub).
  • Il ne devrait y avoir aucune différence si la branche a déjà été extraite d’Origin (c’est-à-dire que le premier déploiement d’une nouvelle branche ne devrait pas idéalement nécessiter d’étapes supplémentaires).
  • Le script est situé sur une machine distante à laquelle plusieurs personnes peuvent accéder. Par conséquent, aucune information d'identification n'est stockée et l'utilisateur/mot de passe doit être entré (mais une seule fois si possible).
  • Je me fiche de tout changement local; 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 référentiel à chaque fois; cela prend trop de temps.
46
szeryf

Vous pourriez suivre une solution similaire à " Comment puis-je forcer“ git pull ”pour écraser les fichiers locaux? " :

git fetch --all
git reset --hard Origin/abranch
git checkout $branch 

Cela impliquerait seulement un aller chercher.

65
VonC

Couple de points:

  • Je crois git stash + git stash drop pourrait être remplacé par git reset --hard
  • ... ou encore plus court, ajoutez -f à checkout commande:

    git checkout -f -b $branch
    

    Cela supprimera tout changement local, comme si git reset --hard a été utilisé avant de passer à la caisse.

En ce qui concerne la question principale: au lieu de passer à la dernière étape, vous pouvez simplement fusionner la branche appropriée de la télécommande dans votre branche locale: git merge $branch Origin/$branch, Je crois que cela ne frappe pas la télécommande. Si tel est le cas, cela élimine le besoin de crédences et, par conséquent, répond à votre plus grande préoccupation.

28
Marcin Łoś

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

Si vous avez simplement un message du type "Les fichiers non suivis suivants seraient écrasés ..." et que vous souhaitiez que la commande distante/Origine/amont écrase les fichiers non suivis en conflit, alors git checkout -f <branch> est la meilleure option.

Si vous êtes comme moi, votre autre option consistait à nettoyer et à effectuer un --hard reset puis recompilez votre projet.

7
Aaron Hull