149 votes

Comment réinitialiser la branche master de git à la branche amont dans un dépôt bifurqué ?

J'ai complètement raté la branche master de mon dépôt git.

Je veux réinitialiser complètement la branche master qui a été poussée sur mon fork avec le contenu du repo master amont. Je n'ai aucun intérêt à conserver les modifications ou l'historique de la branche maîtresse.

L'approche la plus simple aurait été de supprimer mon dépôt de bifurcation et de le refaire à partir du projet amont. Cependant, j'ai du travail dans d'autres branches poussées que je ne veux pas perdre.

Ainsi, comment puis-je réinitialiser ma branche master poussée avec le master amont ?


git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream

Où dois-je aller pour réinitialiser mes branches master locales et distantes avec le master amont ?

285voto

Johannes Barop Points 2419

Vous pouvez réinitialiser votre branche maîtresse locale à la version amont et la pousser vers votre dépôt d'origine.

En supposant que "upstream" est le dépôt d'origine et "origin" est votre fork :

# ensures current branch is master
git checkout master

# pulls all new commits made to upstream/master
git pull upstream master

# this will delete all your local changes to master
git reset --hard upstream/master

# take care, this will delete all your changes on your forked master
git push origin master --force

(Vous pouvez définir le repo original comme "upstream" avec git remote add upstream /url/to/original/repo .)

3 votes

Il devrait probablement être git reset --hard upstream/master pour réinitialiser le répertoire de travail, aussi. Mais votre réponse est néanmoins correcte.

0 votes

Ne pas utiliser "--hard" fonctionne également en conservant les modifications locales. Je ferais le hard reset dans une étape séparée pour éventuellement inspecter la différence.

1 votes

Cela a été très utile.

8voto

Bhavesh Gupta Points 101

Cela réinitialisera votre branche maîtresse avec la branche maîtresse en amont et si la branche a été mise à jour depuis que vous avez bifurqué, ces changements seront également pris en compte.

git checkout master 
git reset upstream/master
git pull --rebase upstream master
git push origin master --force

PS : En supposant que Upstream est le repo original alors que origin est votre copie.

0 votes

Il semblerait que vous ayez créé votre branche à partir d'un commit différent. La raison principale du rebasement est de maintenir un historique linéaire du projet. Ceci dit, vous ne devriez jamais rebaser les commits une fois qu'ils ont été publiés dans un dépôt public car cela remplace les anciens commits par les nouveaux. Pour plus de détails, veuillez consulter atlassian.com/git/tutorials/rewriting-history/git-rebase

8voto

kirelagin Points 5717
git reset --hard @{upstream}

ou, plus court :

git reset --hard @{u}

Ou vous pouvez même aller plus loin et créer un alias qui vous permettra de simplement taper git scrub :

git config --global alias.scrub 'reset --hard @{upstream}'

(Cela suppose que votre branche est configurée pour suivre la branche distante correspondante, ce qui est généralement le cas, sauf si vous faites quelque chose de spécial. Voir git-branch(1) pour plus de détails sur le suivi et git-rev-parse(1) pour plus de détails sur la syntaxe de la spécification des branches).

Et ensuite tu as juste git push --force à votre fourchette, comme expliqué dans d'autres réponses.

0voto

Chetabahana Points 3161

J'ai essayé la méthode comme ceci :

$REPO=<repo>
$ORIGIN=<user>/$REPO
$UPSTREAM=<upstream>/$REPO

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

la sortie montrera un avertissement :

fatal: ambiguous argument 'upstream/master': 
unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Donc la bonne façon de faire est de mettre git pull antes de git reset :

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

alors la sortie sera comme ceci :

From github.com:<upstream>/<repo>
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> upstream/master
HEAD is now at 7a94b1790 Merge pull request #4237 from <upstream>/...
Current branch master is up to date.
Everything up-to-date.

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