¿Cómo restablezco 'maestro' a 'origen / maestro'?

216

¿Puedo hacer lo siguiente de una manera más simple?

git checkout origin/master
git branch -D master
git branch master
git checkout master
Xiè Jìléi
fuente
A veces, esto se puede hacer sin tocar el árbol de trabajo: stackoverflow.com/a/12343727/586086
Andrew Mao
66
Actualice su respuesta aceptada: la respuesta de @ KindDragon es correcta y más corta.
Robert Siemer

Respuestas:

310

Como KindDragon 's respuesta menciona, puede volver a crear masterdirectamente en origin/masterla:

git checkout -B master origin/master

La git checkoutpágina de manual menciona:

Si -Bse da, <new_branch>se crea si no existe; de lo contrario, se restablece . Este es el equivalente transaccional de

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Originalmente sugerido:

Algo como:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

con el paso 2 siendo opcional.

VonC
fuente
1
Puedes hacerlo con una línea.
Robert Siemer
94

Git admite este comando:

git checkout -B master origin/master

Echa un vistazo a la origin/masterrama y luego reinicia la masterrama allí.

TipoDragon
fuente
44
La única respuesta verdadera.
Robert Siemer
3
guarde cuatro pulsaciones de teclas: no necesita las comillas. Just: git checkout -B master origin / master
zumalifeguard
Digamos que cometí 2 cosas, la primera es una fusión con branch y la segunda es regular. ¿Qué sucede con la fusión si vuelvo al origen / maestro?
utdev
1
¿No tienes que hacerlo git fetch origin masterantes para estar seguro de que origin/masterestá actualizado?
pedrozath
Sí, por supuesto, con todas las soluciones que debes hacer git fetchprimero
KindDragon el
29

Creo que incluso la respuesta de VonC tiene complejidad en comparación con esta opción:

git update-ref refs/heads/master origin/master
git reset --hard master

git registra automáticamente cada valor de una referencia (a través del registro de referencias). Entonces, después de ejecutar ese comando, se master@{1}refiere al valor anterior de master.

La respuesta de VonC es correcta, pero desperdicia tiempo revisando el antiguo valor de master en el sistema de archivos.

Si le importan los objetos huérfanos en el repositorio, puede ejecutar git gc

Alexander Bird
fuente
1
Suena una alternativa interesante. +1
VonC
Todavía tengoAlready on 'master'
yourfriendzak
@yourfriendzak, olvidé tener en cuenta que es posible que ya haya revisado el master antes de actualizar el master. He actualizado la respuesta para que sea una que debería funcionar incluso en ese caso también.
Alexander Bird
Esto funciona incluso si no está en el maestro (como un estado HEAD separado que en realidad apunta al origen / maestro de la punta). Luego, puede pagar el master sin tener que voltear archivos viejos a través del repositorio. ¡Excelente!
Andrew Mao
20

Si ya está conectado master, puede hacer lo siguiente:

git reset --hard origin/master

Apuntará la masterrama local al control remoto origin/mastery descartará cualquier modificación en el directorio de trabajo.

Fuad Saud
fuente
Y borrará archivos! Si ha creado / editado archivos y ha ejecutado un "git add" en ellos, este comando los eliminará. Ten cuidado.
Cheeso
¿Es este enfoque mejor que git checkout -B master origin/master?
Jim Aho