Limpie un tenedor y reinícielo desde la parte superior

396

Bifurqué un repositorio, luego hice algunos cambios y parece que lo he estropeado todo.

Deseo comenzar de nuevo desde cero, utilizando el actual upstream / master como base para mi trabajo.
¿Debo volver a basar mi repositorio o eliminarlo?

tampe125
fuente
44
Respuestas muy complejas a una pregunta simple. Simplemente borre todo y clone el repositorio nuevamente.
Yaza
1
@Yaza, no, esto puede causar aún más problemas en algunos escenarios.
Shimmy Weitzhandler
@shimmy, no si quieres comenzar de nuevo desde cero como OP le preguntó.
Yaza

Respuestas:

796

La solución más simple sería (usando ' upstream' como el nombre remoto que hace referencia al repositorio original bifurcado):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Similar a esta página de GitHub, sección "¿Qué debo hacer si estoy en una mala situación?" )

Tenga en cuenta que puede perder los cambios realizados en la masterrama (tanto localmente, debido a reset --hard, y en el lado remoto, debido a push --force).

Una alternativa sería, si desea conservar sus confirmaciones master, para reproducir esas confirmaciones por encima de la actual upstream/master.
Reemplace la parte de reinicio por a git rebase upstream/master. Entonces aún necesitará forzar el empuje.
Consulte también " ¿Qué debo hacer si estoy en una mala situación? "


Una solución más completa, respaldar su trabajo actual (por si acaso) se detalla en " Limpiar la rama maestra de git y mover algunos compromisos a la nueva rama ".

Consulte también " Obtenga nuevas actualizaciones del repositorio original de GitHub en el repositorio bifurcado de GitHub " para ilustrar qué es " upstream".

río arriba


Nota: los repositorios recientes de GitHub protegen la masterrama contra push --force.
Por lo tanto, masterprimero tendrá que desprotegerlo (vea la imagen a continuación) y luego volver a protegerlo después de presionarlo a la fuerza ).

ingrese la descripción de la imagen aquí


Nota: en GitHub específicamente, ahora hay (febrero de 2019) un acceso directo para eliminar repositorios bifurcados para solicitudes de extracción que se han fusionado en sentido ascendente.

VonC
fuente
44
hola, funcionó genial! por cierto, la sintaxis de restablecimiento correcta esgit reset --hard upstream/master
tampe125
1
@ tampe125 Excelente. He arreglado la sintaxis de git reseten la respuesta.
VonC
fatal: 'upstream' no parece ser un repositorio git
Benubird
@Benubird que es el nombre del control remoto que hace referencia al repositorio original (el que bifurcó): vea el gráfico y los git remotecomandos " " en stackoverflow.com/a/3903835/6309 .
VonC
Correcto, pero no está claro en su pregunta cómo configurar eso, ya que por defecto 'upstream' no está definido en la línea de comando como bifurqué a través de github.
Benubird
31

Me encanta la respuesta de VonC. Aquí hay una versión fácil para principiantes.

Hay un control remoto llamado git originque estoy seguro de que todos conocen. Básicamente, puede agregar tantos controles remotos a un repositorio de git como desee. Entonces, lo que podemos hacer es introducir un nuevo control remoto que es el repositorio original, no el tenedor. Me gusta llamarlooriginal

Agreguemos repositorios originales a nuestra bifurcación como control remoto.

git remote add original https://git-repo/original/original.git

Ahora busquemos el repositorio original para asegurarnos de que tenemos el último código

git fetch original

Como, sugirió VonC, asegúrese de que estamos en el maestro.

git checkout master

Ahora para actualizar nuestra bifurcación con el último código en el repositorio original, todo lo que tenemos que hacer es restablecer nuestra rama maestra de acuerdo con el control remoto original.

git reset --hard original/master

Y ya terminaste :)

Ahmad Awais
fuente
2
Estoy llegando fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.al último paso. ¿Algún consejo?
TomNorway
Parece que esto solo te deja stock en la rama remota original. ¿Supongo que le falta un paso para restablecer SU bifurcación al control remoto correcto?
Ray Suelzer
1
originales mejor que upstream(que usan los documentos de Github), ya que origin/masteres "corriente arriba" de local master. Reduce la ambigüedad. Me pregunto si es por eso que lo usas.
vaughan
1
¡Eso es exactamente por qué lo uso!
Ahmad Awais
2
Seguí estas instrucciones y ahora el estado de git dice: En la rama maestra Su rama y 'origen / maestro' han divergido, y tienen 52 y 5 confirmaciones diferentes cada uno, respectivamente. (use "git pull" para fusionar la rama remota en la suya), pero quiero descartar mis 5 confirmaciones. ¿Cuál es el siguiente paso?
usuario3562927
6

Siguiendo @VonC gran respuesta. Es posible que la política de su compañía GitHub no permita 'forzar' al maestro.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Si recibe un mensaje de error como este, intente los siguientes pasos.

Para restablecer su bifurcación de manera efectiva, debe seguir estos pasos:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Abra su bifurcación en GitHub, en "Configuración -> Ramas -> Rama predeterminada" elija 'new_master' como la nueva rama predeterminada. Ahora puede forzar el empuje en la rama 'maestra':

git checkout master
git push --force origin

Luego debe volver a configurar 'maestro' como la rama predeterminada en la configuración de GitHub. Para eliminar 'tmp_master':

git push origin --delete tmp_master
git branch -D tmp_master

Todavía se aplican otras respuestas que advierten sobre la pérdida de su cambio, tenga cuidado.

Hugodby
fuente
4

Cómo hacerlo al 100% a través de la GUI de Sourcetree

(No a todos les gusta hacer cosas a través de la interfaz de línea de comandos de git)

Una vez que esto se ha configurado, solo necesita realizar los pasos 7 a 13 a partir de ese momento.

Fetch> checkout master branch> restablecer a su master> Enviar cambios al servidor

Pasos

  1. En la barra de herramientas del menú en la parte superior de la pantalla: "Repositorio"> "Configuración del repositorio"

"Repositorio" resaltado en la barra de menú superior

  1. "Añadir"

Botón "Agregar" en la parte inferior del cuadro de diálogo

  1. Regrese a GitHub y copie la URL del clon.

Botón "Clonar o descargar" en el sitio web de Github seguido de la URL de git

  1. Pegue la URL en el campo "URL / Ruta" y luego asígnele un nombre que tenga sentido. Lo llamé "maestro". No marque la casilla de verificación "Control remoto predeterminado" . No podrá acceder directamente a este repositorio.

Los campos "Nombre remoto" y "URL / Ruta" resaltados en el cuadro de diálogo "Detalles remotos"

  1. Presione "OK" y debería ver que aparece en su lista de repositorios ahora.

repositorio "maestro" agregado a la lista de repositorios en el cuadro de diálogo "Configuración del repositorio"

  1. Presione "OK" nuevamente y debería ver que aparece en su lista de "Remotos".

repositorio "maestro" resaltado en la lista de controles remotos en la barra lateral

  1. Haga clic en el botón "Obtener" (arriba a la izquierda del área del encabezado del árbol de origen)

Botón "Obtener" en el área del encabezado

  1. Asegúrese de que la casilla de verificación "Recuperar desde todos los controles remotos" esté marcada y presione "ok"

Casilla de verificación "Recuperar de todos los controles remotos" resaltada en el cuadro de diálogo "Recuperar"

  1. Haga doble clic en su rama "maestra" para ver si aún no está desprotegida.

  2. Encuentre la confirmación a la que desea restablecer, si llamó al repositorio "maestro", lo más probable es que desee encontrar la confirmación con la etiqueta "maestro / maestro".

Ejemplo de confirmación con una etiqueta "maestro / maestro"

  1. Haga clic derecho en la confirmación> "Restablecer la rama actual a esta confirmación".

  2. En el cuadro de diálogo, configure el campo "Modo de uso:" en "Descartar por completo todos los cambios de la copia de trabajo" y luego presione "Aceptar" (asegúrese de colocar primero cualquier cambio que no desee perder en una rama separada).

Campo "Modo de uso" resaltado en el cuadro de diálogo "Restablecer para confirmar".  Está configurado para "descartar todos los cambios de copia de trabajo"

  1. Haga clic en el botón "Push" (arriba a la izquierda del área del encabezado del árbol de origen) para cargar los cambios en su copia del repositorio.

Botón "Push" en el área del encabezado

¡Terminaste!

Daniel Tonon
fuente