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?
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? "
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.
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.
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:
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':
(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
En la barra de herramientas del menú en la parte superior de la pantalla: "Repositorio"> "Configuración del repositorio"
"Añadir"
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 "Control remoto predeterminado" . No podrá acceder directamente a este repositorio.
Presione "OK" y debería ver que aparece en su lista de repositorios ahora.
Presione "OK" nuevamente y debería ver que aparece 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úrese de que la casilla de verificación "Recuperar desde todos los controles remotos" esté marcada y presione "ok"
Haga doble clic en su rama "maestra" para ver si aún no está desprotegida.
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".
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 "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).
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.
Respuestas:
La solución más simple sería (usando '
upstream
' como el nombre remoto que hace referencia al repositorio original bifurcado):(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
rama (tanto localmente, debido areset --hard
, y en el lado remoto, debido apush --force
).Una alternativa sería, si desea conservar sus confirmaciones
master
, para reproducir esas confirmaciones por encima de la actualupstream/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
".Nota: los repositorios recientes de GitHub protegen la
master
rama contrapush --force
.Por lo tanto,
master
primero tendrá que desprotegerlo (vea la imagen a continuación) y luego volver a protegerlo después de presionarlo a la fuerza ).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.
fuente
git reset --hard upstream/master
git reset
en la respuesta.git remote
comandos " " en stackoverflow.com/a/3903835/6309 .Me encanta la respuesta de VonC. Aquí hay una versión fácil para principiantes.
Hay un control remoto llamado git
origin
que 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.
Ahora busquemos el repositorio original para asegurarnos de que tenemos el último código
Como, sugirió VonC, asegúrese de que estamos en el maestro.
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.
Y ya terminaste :)
fuente
fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.
al último paso. ¿Algún consejo?original
es mejor queupstream
(que usan los documentos de Github), ya queorigin/master
es "corriente arriba" de localmaster
. Reduce la ambigüedad. Me pregunto si es por eso que lo usas.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:
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':
Luego debe volver a configurar 'maestro' como la rama predeterminada en la configuración de GitHub. Para eliminar 'tmp_master':
Todavía se aplican otras respuestas que advierten sobre la pérdida de su cambio, tenga cuidado.
fuente
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)
Pasos
Haga doble clic en su rama "maestra" para ver si aún no está desprotegida.
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".
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 "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).
¡Terminaste!
fuente