Limpiar una bifurcación y reiniciarla desde el principio.
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?
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 master
sucursal (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é upstream
es " ".
Nota: los repositorios recientes de GitHub protegen la master
rama 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 ).
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.
Me encanta la respuesta de VonC. Aquí hay una versión fácil para principiantes.
Hay un control remoto de git llamado origin
que 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 :)
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.
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
- En la barra de herramientas del menú en la parte superior de la pantalla: "Repositorio" > "Configuración del repositorio"
- "Agregar"
- Regrese a GitHub y copie la URL del clon.
- 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.
- Presione "Aceptar" y debería verlo aparecer en su lista de repositorios ahora.
- Presione "Aceptar" nuevamente y debería verlo aparecer en su lista de "Remotos".
- Haga clic en el botón "Obtener" (arriba a la izquierda del área del encabezado del árbol de origen)
- Asegúrate de que la casilla de verificación "Obtener desde todos los controles remotos" esté marcada y presiona "ok"
Haga doble clic en su rama "maestra" para verificarla si aún no lo está.
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".
Haga clic derecho en la confirmación > "Restablecer la rama actual a esta confirmación".
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).
- 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.
¡Terminaste!
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 main
rama 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 b
upstream para indicar que es una sucursal local.
Ahora puede crear una nueva rama de funciones a partir del seguimiento y puede usar git difftool
o lo que sea para comparar y copiar selectivamente del trabajo abandonado, si es necesario.