Écraser ma succursale locale avec une succursale distante

153

J'ai complètement fubar'd ma succursale locale et j'aimerais recommencer. La version sur le serveur est correcte.

Je ne veux pas recommencer, je voudrais utiliser mon histoire locale pour réparer mon énorme problème. (Je peux si je le dois.)

git fetch branchname, et git pull branchnamene fonctionne pas. Le message que je reçois est « à jour » cependant, ma version locale ne correspond pas à celle du serveur.

git pull origin/branchnameme donne une erreur " non trouvé ".

Sara Chipps
la source

Réponses:

248

tout d'abord, créez une nouvelle branche à la position actuelle (au cas où vous auriez besoin de votre ancien historique `` foiré ''):

git branch fubar-pin

mettez à jour votre liste de branches distantes et synchronisez les nouveaux commits:

git fetch --all

puis, réinitialisez votre branche au point où l'origine / branche pointe vers:

git reset --hard origin/branch

attention , cela supprimera toutes les modifications de votre arbre de travail !

tricot
la source
2
+1 mais vous voudrez peut-être ajouter un rappel à faire git fetch originavant la réinitialisation
Mark Longair
J'ai fait cela avec un léger changement et cela n'a pas fonctionné: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (quelques autres choses), git reset --hard origin / branch. Le résultat final était que j'étais toujours à l'ancien commit. Donc, cette approche peut fonctionner dans certains cas, mais je pense que cela ne fonctionne pas du tout.
greggles
@greggles: Des erreurs? Après la dernière commande, HEAD doit pointer sur l'origine / la branche.
knittl
1
@Gavin: non, cela n'affectera en aucun cas d'autres branches que origin/branch. Jamais.
knittl
1
@greggles Je sais que c'est très tard, mais pour d'autres personnes se demandant pourquoi cela pourrait arriver, cette approche ne fonctionnera que si vous avez vérifié une branche. Cela n'a pas fonctionné pour vous parce que vous étiez dans l' état HEAD détaché (HEAD pointe sur un commit, pas sur une branche) et ces commandes ne fonctionnent que si HEAD pointe sur une branche. Lorsque vous faites git resetalors que HEAD pointe sur une branche, cette branche suivra.
Michael Dorst
60

Ce que je fais lorsque je gâche ma branche locale, c'est que je renomme simplement ma branche cassée et que je vérifie / branche à nouveau la branche en amont:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Ensuite, si vous êtes sûr de ne rien vouloir de votre ancienne branche, supprimez-la:

git branch -D branch-old

Mais généralement, je laisse l'ancienne succursale localement, juste au cas où j'aurais quelque chose là-dedans.

Casey Marshall
la source
4
Cela semble être la meilleure réponse. Cela permet de créer une copie de sauvegarde au cas où et semble très probable que la branche locale soit une copie exacte de la branche distante.
greggles
Excellente réponse, utile pour moi. Un Q: La documentation officielle de git-checkout semble indiquer que votre troisième commande devrait être: la git checkout -b <branch> --track <remote>/<branch>vôtre fonctionne-t - elle aussi bien, sans le --track?
Starman
1
Je pense que le config var branch.autoSetupMerge(qui je pense par défaut à true) rend l' --trackimplicite. Et, oui, dans toutes mes configurations git, je n'ai pas besoin de le faire explicitement --tracklorsque je fais un checkout -b, mais YMMV.
Casey Marshall
5

Votre succursale locale a probablement des modifications que vous souhaitez supprimer. Pour ce faire, vous devrez utiliser git resetpour réinitialiser la tête de branche au dernier endroit où vous avez divergé de la branche du dépôt en amont. Utilisez git branch -vpour trouver l'identifiant sha1 de la branche amont et réinitialisez votre branche en l'utilisant git reset SHA1ID. Ensuite, vous devriez être en mesure de faire ungit checkout pour annuler les modifications qu'il a laissées dans votre répertoire.

Remarque: faites toujours cela sur un dépôt sauvegardé. De cette façon, vous pouvez vous assurer que cela a bien fonctionné. Ou si ce n'est pas le cas, vous avez une sauvegarde sur laquelle revenir.

Wes Hardaker
la source
Cela donne l'impression que cela fonctionnerait probablement, mais étant donné la simplicité et la fiabilité de l'approche consistant à "faire une copie de votre travail ailleurs, faire une nouvelle copie de la branche distante", je ne vois pas en quoi c'est mieux.
greggles
2
git reset --hard

Ceci permet de rétablir toutes vos modifications locales sur la tête d'origine

Karthikeyan Varadarajan
la source