Comment réinitialiser la branche git master vers la branche amont dans un référentiel forké?

103

J'ai complètement gâché la branche principale de mon dépôt git fourchu.

Je veux réinitialiser complètement la branche principale qui a été poussée vers ma fourchette avec le contenu du référentiel principal en amont. Je n'ai aucun intérêt à conserver les changements ou l'historique de la branche principale.

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

Alors, comment réinitialiser ma branche maître poussée avec le maître amont?


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

Où est-ce que je vais à partir d'ici pour réinitialiser mes branches principales locales et distantes avec le maître en amont?

liberté fossile
la source

Réponses:

189

Vous pouvez réinitialiser votre branche principale locale à la version amont et la pousser dans votre référentiel.

En supposant que "upstream" est le référentiel d'origine et que "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 dépôt d'origine comme "en amont" avec git remote add upstream /url/to/original/repo.)

Johannes Barop
la source
1
Cela devrait probablement être aussi git reset --hard upstream/masterpour réinitialiser le répertoire de travail. Mais votre réponse est néanmoins correcte.
j6t
Ne pas utiliser "--hard" fonctionne également tout en conservant les modifications locales. Je ferais la réinitialisation matérielle dans une étape spérée pour éventuellement inspecter le diff.
Johannes Barop
1
Cela a été très utile.
Aleem S
4
Besoin d'appeler d' git fetch upstreamabord
Henry E
3
Comme le note @HenryE, le fait de ne pas récupérer d'abord les modifications en amont avec git fetch upstreamentraîne généralement l'erreur non lisible par l'homme suivante:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry
5

Cela réinitialiserait votre branche principale avec le maître en amont et si la branche a été mise à jour depuis votre fork, elle extraira également ces modifications.

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

PS: en supposant que Upstream est le dépôt d'origine tandis que l'origine est votre copie.

Bhavesh Gupta
la source
Il semblerait que vous ayez créé votre branche à partir d'un commit différent. La raison principale du rebasage est de conserver un historique de projet linéaire. Cela dit, vous ne devriez jamais rebaser les commits une fois qu'ils ont été publiés dans un référentiel public car cela remplace les anciens commits par de nouveaux. Pour plus de détails, veuillez consulter atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167
0

J'ai essayé la méthode comme celle-ci:

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

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

la sortie affichera 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 manière est mise git pullavant git reset:

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$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.
Chetabahana
la source