git descarta todos los cambios y tira desde arriba

145

¿Cómo obtengo un repositorio ascendente y hago que reemplace al maestro? Solo tengo una rama en mi repositorio, que es maestra, y la arruiné por completo, por lo que básicamente necesito comenzar desde el principio. Creo que init hará el trabajo, pero ¿hay alguna manera más fácil?

NinjaCowgirl
fuente

Respuestas:

251

Hay (al menos) dos cosas que puede hacer aquí: puede reclinar el repositorio remoto, o puede reset --hardhacerlo con el ancestro común y luego hacer una extracción, que avanzará rápidamente a la última confirmación en el maestro remoto.

Para ser concretos, aquí hay una extensión simple de la respuesta original de Nevik Rehnel:

git reset --hard origin/master
git pull origin master

NOTA : el uso git reset --harddescartará cualquier cambio no confirmado, y puede ser fácil confundirse con este comando si es nuevo en git, así que asegúrese de tener una idea de lo que va a hacer antes de continuar.

Eric Walker
fuente
1
Más ayuda para los novatos: git gclimpia y corre a través de algunas tareas domésticas. En otra nota, nunca he corrido git gc. Es agradable correr, pero no es necesario.
Joshua Dance
@JoshuaDance - buen punto. No estoy seguro de por qué lo incluí originalmente.
Eric Walker
23

mientras está en la rama maestra: git reset --hard origin/master

luego haga un poco de limpieza con git gc(más sobre esto en las páginas del manual)

Actualización: Probablemente también deba hacer un git fetch origin(o git fetch origin mastersi solo quiere esa rama); No debería importar si hace esto antes o después del reinicio. (Gracias @ eric-walker)

Nevik Rehnel
fuente
1
Es posible que deba hacer un tirón después del reset --hard.
Eric Walker
No es necesario extraer del maestro una vez que se ejecuta git fetch origin antes del reinicio.
sciritai
@sciritai: mi comentario fue agregado antes de la mención de buscar desde el origen.
Eric Walker
19

Puedes hacerlo en un solo comando:

git fetch --all && git reset --hard origin/master

O en un par de comandos:

git fetch --all
git reset --hard origin/master

Tenga en cuenta que perderá TODOS sus cambios locales

Luca C.
fuente
5
git reset <hash>  # you need to know the last good hash, so you can remove all your local commits

git fetch upstream
git checkout master
git merge upstream/master
git push origin master -f

voila, ahora tu bifurcación está de vuelta a la corriente arriba.

resultados
fuente
0

Finalmente me di cuenta de que en lugar de git fetch --all && git reset --hard origin/master, debería ser git fetch --all && git reset --hard origin/<branch_name>, en su lugar (si uno trabaja en una rama diferente)

BitFreak
fuente