¿Cómo restablezco la rama git master a la rama ascendente en un repositorio bifurcado?

108

He estropeado completamente la rama maestra de mi repositorio de git bifurcado.

Quiero restablecer completamente la rama maestra que se envió a mi bifurcación con el contenido del repositorio maestro ascendente. No tengo interés en retener ningún cambio o historial de la rama principal.

El enfoque más simple habría sido eliminar mi repositorio bifurcado y reformar del proyecto anterior. Sin embargo, tengo trabajo en otras ramas empujadas que no quiero perder.

Entonces, ¿cómo reinicio mi rama maestra empujada con el maestro aguas arriba?


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

¿A dónde voy desde aquí para restablecer mis ramas maestras locales y remotas con el maestro ascendente?

libertad
fuente

Respuestas:

204

Puede restablecer su rama maestra local a la versión anterior y enviarla a su repositorio.

Suponiendo que "upstream" es el repositorio original y "origin" es su bifurcación:

# 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

(Puede definir el repositorio original como "ascendente" con git remote add upstream /url/to/original/repo).

Johannes Barop
fuente
1
Probablemente también debería ser git reset --hard upstream/masterpara restablecer el directorio de trabajo. Sin embargo, su respuesta es correcta.
j6t
1
Esto fue muy útil.
Aleem S
4
Necesito llamar git fetch upstreamprimero
Henry E
4
Como señala @HenryE, si no se obtienen los cambios ascendentes primero, git fetch upstreamnormalmente se produce el siguiente error no legible por humanos:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry
1
Solo tenga cuidado de que el empuje forzado cierre automáticamente todas las solicitudes de extracción abiertas que realizó para el flujo ascendente. No estaba consciente de esto, lo cual fue un poco sorprendente.
Frank Buss
5

Esto restablecería su rama maestra con el maestro ascendente y si la rama se ha actualizado desde su bifurcación, también extraería esos cambios.

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

PD: Suponiendo que Upstream es el repositorio original, mientras que el origen es su copia.

Bhavesh Gupta
fuente
Parecería como si hubiera creado su rama a partir de una confirmación diferente. La razón principal para reajustar es mantener un historial de proyecto lineal. Dicho esto, nunca debes cambiar la base de las confirmaciones una vez que se hayan publicado en un repositorio público porque esto reemplaza las confirmaciones antiguas por otras nuevas. Para obtener más información, consulte atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167
0

He probado el método como este:

$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 salida mostrará una advertencia:

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>...]'

Entonces la forma correcta se pone git pullantesgit 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

entonces la salida será así:

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
fuente