¿Cómo limpio mi bifurcación de Github para poder realizar solicitudes de extracción limpias?

83

Bifurqué un repositorio en Github. Hice algunos cambios menores y envié solicitudes de extracción en sentido ascendente, pero en el camino mi bifurcación se ha vuelto tan destrozada que no puedo generar solicitudes de extracción limpias; cuando inicio una solicitud de extracción desde una rama con seis cambios, Github quiere enviar trece, y siete de ellos ya existen en sentido ascendente (natch).

Mi problema parece estar relacionado con solo extraer las últimas confirmaciones , pero cuando creo una nueva rama y selecciono confirmaciones, todavía tengo extras. También he tenido problemas con el rebase , pero ahora parece que incluso mi maestro está tan arruinado que no puedo generar una copia limpia de upstream . Aparentemente, esto se debe a que no entendí que necesitaba reajustar en lugar de fusionar , así que claramente cometí errores; lo que estoy tratando de hacer es descubrir cómo desenredar ese nudo y volver a un estado limpio en el que pueda avanzar de manera útil.

Como que quiero volar mi bifurcación y hacer una nueva bifurcación de la corriente arriba, pero creo que eso también es difícil.

Habiendo confesado mis pecados de Git, ¿cómo obtengo la absolución de github?

pjmorse
fuente
1
Amo tu confesión y solicitud de ser absuelto :-)
Jon Kern
¿Qué, hay personas para quienes git no es una religión? ;-)
pjmorse

Respuestas:

102

Paso 1: Extraiga los cambios ascendentes
Se recomienda agregar el repositorio ascendente como "ascendente" como se explica en la página Fork a Repo :

git pull --rebase upstream master

La --rebaseopción coloca sus cambios encima de la última confirmación sin fusiones.

Paso 2: (Opcional) Fusiona tus confirmaciones en 1 confirmación

git reset --soft upstream/master

Este comando "deshará" todas sus confirmaciones, pero no cambiará los archivos. Entonces puede confirmar todos sus cambios en una sola confirmación.

git commit -a

Paso 3: Verifique y pruebe sus cambios

Para mostrar los cambios, use una GUI como la integrada gitk, Sourcetree , TortoiseGit o Tower (de pago) , etc.

Paso 4: Empuje

git pusharrojará un error, porque la inserción cambiaría el historial del repositorio de destino.
Si está seguro de que los cambios que se muestran en el paso 3 son correctos, presione con "-f"

git push -f origin master


Información adicional
El comando para agregar un control remoto es:

git remote add upstream git://github.com/[username]/[project].git

También puede extraer de una URL directa:

git pull --rebase  git://github.com/[username]/[project].git

Pero luego necesitará el hash de la última confirmación upstream en lugar de "upstream / master" en los otros pasos.

Bob Fanger
fuente
3
Muchas gracias. GitHub debería actualizar su Fork A Repo .
buschtoens
¡Gracias! Intenté varias formas de resolver este problema, pero nada funcionó. Estaba a punto de volar mi tenedor antes de encontrar esta respuesta ... y funcionó. ¡Gracias!
Judah Gabriel Himango
Hola, @JudahHimango. ¿Ha seguido también el "paso 2"? Porque estoy en la misma situación que tú. Me puedes ayudar.
arunit21 de
Este es un gran recurso. ¡Gracias!
Dr. Jan-Philip Gehrcke
Mi repositorio bifurcado seguía diciendo que no estaba sincronizado con el flujo ascendente, por lo que tiraba hacia abajo y me fusionaba, lo que conducía a confirmaciones en mi bifurcación que no eran necesarias. Usar este enfoque y forzar el empujón ha solucionado esto. También usé rebase para combinar algunas de mis confirmaciones anteriores: git rebase -i HEAD ~ n [donde n es el número de confirmaciones]
The Coder
4

Según tengo entendido, tanto con Git como con Mercurial (solo he usado este último, por lo que puedo estar equivocado) no es gran cosa hacer volar un tenedor y volver a hornearlo. Hago eso todo el tiempo con mis proyectos. Si está de acuerdo con hacer eso (puede hacer una copia de seguridad de sus cambios o no tiene ningún cambio significativo en su bifurcación), diría que probablemente sea el camino a seguir.

Recuerde, con DVCS, bifurcar un repositorio hace un clon completo de todo ese repositorio . Si elimina su bifurcación actual y luego bifurca el repositorio original nuevamente, tendrá una pizarra completamente limpia para trabajar.

Sean Edwards
fuente
Fork en este caso es una característica especial de github, no el núcleo de git, aunque usa características principales de git. Hay habilidades administrativas especiales de github que puedes hacer con github-forks.
Seth Robertson
1
Ah, ya veo. Utilizo BitBucket principalmente, y allí "Fork" es sinónimo de "clonar" cuando trabajas con copias de trabajo personales. Dejaré mi respuesta aquí de todos modos, aunque por si acaso.
Sean Edwards
Sí, borré mi clon local y ya lo volví a clonar varias veces. Hice un experimento con otro repositorio y parece que no hay problema con eliminar una bifurcación y crear una nueva desde la misma fuente.
pjmorse
NB, estoy usando git format-patchpara preservar las confirmaciones que quiero guardar primero.
pjmorse
1
Eliminar su repositorio bifurcado y reformar es innecesario, y usarlo git format-patchpara guardar su trabajo es una especie de eludir todas las herramientas útiles que tiene git para administrar ramas. En el futuro, usar git rebase -ipara reescribir selectivamente sus confirmaciones en la parte superior de la nueva masterrama ascendente es lo correcto.
Mark Longair
0

En su repositorio privado, agregue el repositorio de forkee como un control remoto. Rebase / restablezca sus ramas desde las ramas del control remoto. Haga un empuje forzado a su repositorio de github.

Si necesita comandos exactos, hágamelo saber. También avíseme si quiere intentar preservar las confirmaciones locales o si "volar lejos" está bien.

Seth Robertson
fuente