Comment forcer git pull à tout écraser à chaque tir?

j'ai un dépôt central nu qui a trois dépôts de développeur tirant et poussant à lui normalement.

j'ai aussi deux autres dépôts qui sortent du repo central: l'un est le serveur live, et l'autre est un serveur test/stage-chacun tirant de sa propre branche respective.

le scénario est le suivant: j'ai un script post-update sur le Central repo qui accède automatiquement au test et aux repos en direct et exécute un tirez la commande sur chaque. Ceci met à jour à la fois les serveurs de test et les serveurs en direct, tout dépendant de la branche qui a de nouvelles propagations. Tout cela fonctionne très bien.

le problème est le suivant: il peut arriver en cas d'urgence que des fichiers soient mis à jour directement sur le serveur (via ftp ou autre) et que le script CENTRAL de post-mise à jour échoue car des conflits de fusion/réécriture se produiront. Il n'y a aucun moyen d'éviter ce scénario, et c'est inévitable.

ce que j'aimerais avoir arriver, c'est ceci: je veux l'extraire à partir du live et des sites d'essai toujours overwrite/fusion sur pull. toujours. ces pensions seront pull-only car ils ne sont pas pour le 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? Il ferait un excellent scénario de développement.

174
demandé sur Mel 2012-03-06 22:36:28

7 réponses

vraiment la façon idéale de faire ceci est de ne pas utiliser pull du tout, mais plutôt fetch et reset :

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

(en remplaçant master par n'importe quelle branche que vous voulez suivre.)

pull est conçu autour de la fusion des changements d'une manière ou d'une autre, tandis que reset est conçu autour de la simple correspondance de votre copie locale avec une propagation spécifique.

vous pouvez envisager légèrement différentes options pour clean selon les besoins de votre système.

439
répondu Amber 2012-03-07 19:40:14

vous pourriez essayer ceci:

git reset --hard HEAD
git pull

(de Comment puis-je la force "git pull" pour remplacer les fichiers locaux? )

une autre idée serait de supprimer tout le git et de faire un nouveau clone.

18
répondu user1251007 2017-05-23 12:18:25

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

git reset --hard
git pull

ou même

git stash
git pull
6
répondu Matt Wolfe 2012-03-06 18:40:47

pour tirer une copie de la branche et écrasement de force des fichiers locaux de l'utilisation de l'origine:

git reset --hard origin/current_branch

tout le travail en cours sera perdu et il sera alors le même que la branche d'origine

4
répondu Andrew Atkinson 2016-03-22 08:39:44
git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch
4
répondu Dzmitry 2016-12-23 19:01:05

vous pouvez changer le crochet pour essuyer tout propre.

# 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
répondu Dietrich Epp 2012-03-06 18:40:39

si vous n'avez pas encore engagé les changements locaux depuis le dernier pull / clone, vous pouvez utiliser:

git checkout *
git pull

checkout effacera vos modifications locales avec le dernier commit local, et pull sera sincronize pour le dépôt distant

1
répondu Maviles 2016-08-22 17:47:49