web-dev-qa-db-fra.com

Comment puis-je forcer git pull à tout écraser à tout écraser?

J'ai un référentiel nu CENTRAL qui a trois référentiels de développeurs qui s'y attirent et qui y poussent normalement.

J'ai également deux autres référentiels tirés du référentiel nu de CENTRAL: l'un est le serveur actif et l'autre est un serveur de test/étape, chacun extrait de sa propre branche respective.

Le scénario est le suivant: j'ai un script de raccordement _post-update_ sur le dépôt CENTRAL qui accède automatiquement au test et aux mises en pension et exécute une commande d'extraction sur chacun d'eux. Cela met à jour les serveurs de test et les serveurs en direct, en fonction de la branche qui a de nouveaux commits. Tout cela fonctionne très bien.

Le problème est le suivant: il peut arriver que, dans une situation d'urgence, des fichiers soient mis à jour directement sur le serveur (via ftp ou autre) et que le script de post-mise à jour de CENTRAL échoue, car des conflits de fusion/écrasement se produisent. Il n’ya aucun moyen d’éviter ce scénario et c’est inévitable.

Ce que j'aimerais que cela se produise est le suivant: je veux que l’attraction des sites en direct et des sites d’essai soit toujours écrasante/fusionnée lors de l'extraction. Toujours. Ces dépôts seront collectés uniquement car ils ne sont pas destinés au développement.

Dans toutes mes recherches, je ne peux pas trouver une bonne solution pour avoir un pull toujours forcer un écrasement des fichiers locaux. Est-ce possible? Si tel était le cas, cela constituerait un excellent scénario de développement.

189
bmilesp

En réalité, le moyen idéal de le faire est de ne pas utiliser du tout pull, mais plutôt fetch et reset:

git fetch Origin master
git reset --hard FETCH_HEAD
git clean -df

(Modification de master sur la branche que vous souhaitez suivre.)

pull est conçu de manière à fusionner les modifications, alors que reset consiste simplement à faire en sorte que votre copie locale corresponde à un commit spécifique.

Vous pouvez envisager des options légèrement différentes de clean en fonction des besoins de votre système.

471
Amber

Vous pouvez essayer ceci:

git reset --hard HEAD
git pull

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

Une autre idée serait de supprimer tout le git et de créer un nouveau clone.

20
user1251007

Je ne sais pas comment le faire en une seule commande, mais vous pouvez faire quelque chose comme:

git reset --hard
git pull

ou même

git stash
git pull
6
Matt Wolfe
git reset --hard HEAD
git fetch --all
git reset --hard Origin/your_branch
5
Dzmitry

Pour extraire une copie de la branche et forcer l’écrasement des fichiers locaux à partir de l’origine, utilisez:

git reset --hard Origin/current_branch

Tous les travaux en cours seront perdus et seront alors identiques à ceux de la branche Origin.

5
Andrew Atkinson

Vous pouvez changer le crochet pour tout nettoyer.

# Danger! Wipes local data!

# Remove all local changes to tracked files
git reset --hard HEAD

# Remove all untracked files and directories
git clean -dfx

git pull ...
2
Dietrich Epp

Si vous n'avez pas encore validé les modifications locales depuis le dernier pull/clone, vous pouvez utiliser:

git checkout *
git pull

checkout effacera vos modifications locales avec le dernier commit local, et pull le synchronisera dans le référentiel distant

2
Maviles