Limpiar una bifurcación y reiniciarla desde el principio.

Resuelto tampe125 asked hace 12 años • 5 respuestas

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

Deseo empezar de nuevo desde cero, utilizando el upstream/master actual como base para mi trabajo.
¿Debo cambiar la base de mi repositorio o eliminarlo por completo?

tampe125 avatar Mar 10 '12 18:03 tampe125
Aceptado

La solución más simple sería (usando ' upstream' como 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 mastersucursal (tanto localmente, debido a reset --hard, como en el lado remoto, debido a push --force).

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


Una solución más completa, hacer una copia de seguridad de su trabajo actual (por si acaso) se detalla en " Limpiar la rama maestra de git y mover algunas confirmaciones a una nueva rama ".

Consulte también " Extraer nuevas actualizaciones del repositorio de GitHub original al repositorio de GitHub bifurcado " para ilustrar qué upstreames " ".

río arriba


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

ingrese la descripción de la imagen aquí


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

VonC avatar Mar 10 '2012 12:03 VonC

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

Hay un control remoto de git llamado originque estoy seguro que todos conocen. Básicamente, puedes agregar tantos controles remotos a un repositorio de git como quieras. Entonces, lo que podemos hacer es introducir un nuevo control remoto que sea el repositorio original, no el fork. 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 la última versión codificada.

git fetch original

Como sugirió VonC, asegúrese de que estemos 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 listo :)

Ahmad Awais avatar Sep 22 '2016 00:09 Ahmad Awais

Siguiendo a @VonC, gran respuesta. Es posible que la política de su empresa de GitHub no permita el "impulso forzado" en el 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 efectivamente su bifurcación, 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 puedes forzar el empuje en la rama 'master':

git checkout master
git push --force origin

Luego debes volver a establecer 'master' 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

Otras respuestas que advierten sobre la pérdida de su cambio aún se aplican, tenga cuidado.

Hugodby avatar Aug 07 '2017 13:08 Hugodby

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

(No a todo el mundo le gusta hacer cosas a través de la interfaz de línea de comandos de git)

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

Obtener> rama maestra de pago> restablecer a su maestro> 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. "Agregar"

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 "Remoto predeterminado" . No podrá enviar directamente a este repositorio.

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

  1. Presione "Aceptar" y debería verlo aparecer 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 "Aceptar" nuevamente y debería verlo aparecer 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 "Buscar" en el área del encabezado

  1. Asegúrate de que la casilla de verificación "Obtener desde todos los controles remotos" esté marcada y presiona "ok"

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

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

  2. Busque la confirmación 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 una confirmación con una etiqueta "master/master"

  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 "Difícil: descartar todos los cambios de la copia de trabajo" y luego presione "Aceptar" (asegúrese de colocar primero los cambios que no desea perder en una rama separada).

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

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

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

¡Terminaste!

Daniel Tonon avatar Aug 06 '2018 11:08 Daniel Tonon

La respuesta de VonC dice

Tenga en cuenta que puede perder los cambios realizados en la rama maestra (tanto localmente, debido al reinicio --hard, como en el lado remoto, debido al push --force).

Así que solo cubriré cómo crear una nueva rama en la bifurcación existente que rastrea la mainrama del repositorio del que se bifurcó originalmente.

Por qué esto puede ser importante: supongamos que ya tiene otra solicitud de extracción enviada para una característica diferente de la misma bifurcación. O alguien más se ha bifurcado de tu tenedor. Entonces un reinicio completo es malo.

Suponiendo que el control remoto bifurcado se llame upstream.

git fetch upstream main
git switch -c upstreamb/main/track upstream/main

Estarás en una nueva sucursal.upstreamb/main/track

% git branch 
...
* upstreamb/main/track
% git pull upstream main
From github.com:XXXX/YYYY
 * branch                  main       -> FETCH_HEAD
Already up to date.

Observe que /en el nombre de la sucursal está permitido. Para evitar confusión y ambigüedad, he agregado bupstream para indicar que es una sucursal local.

Ahora puede crear una nueva rama de funciones a partir del seguimiento y puede usar git difftoolo lo que sea para comparar y copiar selectivamente del trabajo abandonado, si es necesario.

Craig Hicks avatar May 06 '2022 19:05 Craig Hicks