Obtenga nuevas actualizaciones del repositorio original de GitHub en el repositorio bifurcado de GitHub

615

Bifurqué el repositorio de alguien en GitHub y me gustaría actualizar mi versión con confirmaciones y actualizaciones realizadas en el repositorio original. Estos se hicieron después de que bifurqué mi copia.

¿Cómo puedo incorporar los cambios que se hicieron en el origen e incorporarlos a mi repositorio?

por qué
fuente
1
Posible duplicado, o quizás solo relacionado: Fusión entre horquillas en GitHub .
En caso de que desee sincronizar etiquetas adicionales, ¡hágalo git push --force origin --tagsdespués de las soluciones propuestas!
MediaVince
1
Posible duplicado de ¿Cómo actualizo un repositorio bifurcado de GitHub?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

716

Debe agregar el repositorio original (el que bifurcó) como control remoto.

Desde la página de manual de la horquilla GitHub :

tenedor

Una vez que el clon esté completo, su repositorio tendrá un control remoto llamado " origin" que señala su bifurcación en GitHub.
No dejes que el nombre te confunda, esto no apunta al repositorio original del que bifurcaste. Para ayudarlo a realizar un seguimiento de ese repositorio, agregaremos otro control remoto llamado "upstream":

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

También tienes una gema de rubí que puede facilitar esas operaciones de GitHub .

ahorquillado

Consulte también "¿ Git fork es git clone? ".

VonC
fuente
14
Ver también bassistance.de/2010/06/25/git-fu-updating-your-github-fork para un buen resumen.
VonC
2
@syedrakib Prefiero a git rebase upstream/master, pero he agregado las dos posibilidades en la respuesta.
VonC
1
@PaBLoX si ha bifurcado un repositorio, está trabajando en su repositorio, en su sucursal: rebase y fuerce un empujón: no hay desorden involucrado. Incluso una solicitud de extracción en curso se actualizará correctamente.
VonC
2
@PaBLoX no creas un desastre: tú git push --force, reemplazando el historial de tu sucursal en GitHub por tu sucursal local que acabas de modificar. Como solo tú estás usando una rama triste, no hay lío involucrado.
VonC
2
Entiendo. Sigo pensando que es difícil, no trivial y no intuitivo. Aún así, es extraño que mis cambios siempre estén en la parte superior (último), mientras que en realidad se hicieron antes. La solución que publiqué antes se ve mejor (todavía no es trivial). El problema es que commit hash cambia (obviamente, ya que hay un nuevo padre) y genera mucho ruido dentro de github cuando se llaman problemas. Aún así, me sorprende que no haya una manera de mantenerse actualizado con el flujo ascendente y administrar su propia bifurcación sin crear compromisos de fusión sin sentido o "mentir" sobre la historia.
Pablo Olmos de Aguilera C.
99

Además de la respuesta de VonC, puede ajustarlo a su gusto aún más.

Después de buscar desde la rama remota, aún tendría que fusionar las confirmaciones. Yo reemplazaria

$ git fetch upstream

con

$ git pull upstream master

dado que git pull es esencialmente git fetch + git merge.

n00shie
fuente
¿Qué sucede si sé que la rama ascendente no tiene ningún cambio en los archivos existentes, pero solo se agregan algunos archivos de recursos? ¿Todavía necesito fusionar?
azec-pdx
44
Seguramente hará un avance rápido en ese caso
Domness
¿Cómo hacer principal aguas arriba de sobrescribir todos los archivos locales (por lo que no hay conflictos de fusión) principal aguas arriba es líder en el código en este caso por lo que confiamos en que el 100% ... han logrado hacer esto
snh_nl
1
@snh_nl git rebase upstream masterTenga en cuenta que esto no está exento de conflictos si se ha desviado lo suficiente upstream/master. Vea git-scm.com/docs/git-rebase (tl; dr: esto restablece su maestro local al de aguas arriba, y luego intenta reactivar todos los compromisos locales desde el punto de divergencia hacia adelante)
cowbert
68

Este video muestra cómo actualizar una bifurcación directamente desde GitHub

Pasos:

  1. Abre tu tenedor en GitHub.
  2. Haga clic en Pull Requests.
  3. Haga clic en New Pull Request. De forma predeterminada, GitHub comparará el original con su bifurcación, y no debería haber nada para comparar si no realizó ningún cambio.
  4. Haga clic en switching the base. Ahora GitHub comparará su bifurcación con el original, y debería ver todos los últimos cambios.
  5. Haga clic en Create a pull requestpara esta comparación y asigne un nombre predecible a su solicitud de extracción (por ejemplo, Actualizar desde original).
  6. Haga clic en Create pull request.
  7. Desplácese hacia abajo y haga clic Merge pull requesty finalmente Confirmfusionar. Si su bifurcación no tuvo ningún cambio, podrá fusionarlo automáticamente.
Dmitry Pavlov
fuente
3
Desafortunadamente, este agradable método gráfico crea ruido adicional en su bifurcación como se menciona anteriormente en los comentarios para la respuesta aceptada. Por lo tanto, se recomienda el método de línea de comandos: help.github.com/articles/syncing-a-fork
Jonathan Cross
No pude encontrar la switching the baseopción
Alper
64

Utilizar:

git remote add upstream ORIGINAL_REPOSITORY_URL

Esto configurará su flujo ascendente al repositorio desde el que se bifurcó. Entonces haz esto:

git fetch upstream      

Esto buscará todas las ramas, incluido el maestro del repositorio original.

Combine estos datos en su rama maestra local:

git merge upstream/master

Empuje los cambios a su repositorio bifurcado, es decir, al origen:

git push origin master

Voila! Has terminado con la sincronización del repositorio original.

ARCA
fuente
¿Cómo hacer principal aguas arriba de sobrescribir todos los archivos locales (por lo que no hay conflictos de fusión) principal aguas arriba es líder en el código en este caso por lo que confiamos en que el 100% ... han logrado hacer esto
snh_nl
Una forma es simplemente eliminar la copia local y hacer una nueva clonación :)
ARCA el
1

Si está utilizando la aplicación de escritorio GitHub, hay un botón de sincronización en la esquina superior derecha. Haga clic en él y luego Update from <original repo>cerca de la esquina superior izquierda.

Si no hay cambios para sincronizar, esto estará inactivo.

Aquí hay algunas capturas de pantalla para facilitar esto.

sudo bangbang
fuente
1

Si no hay nada que perder, también puede eliminar su bifurcación, simplemente vaya a la configuración ... vaya a la sección de zona de peligro a continuación y haga clic en Eliminar repositorio. Le pedirá que ingrese el nombre del repositorio y su contraseña después. Después de eso, simplemente bifurca el original nuevamente.

Chan
fuente
1

Si quieres hacerlo sin cli, puedes hacerlo completamente en el sitio web de Github.

  1. Ve a tu repositorio de fork.
  2. Haga clic en New pull request.
  3. Asegúrese de establecer su bifurcación como el repositorio base, y el repositorio original (ascendente) como repositorio principal. Por lo general, solo desea sincronizar la rama maestra.
  4. Create new pull request.
  5. Seleccione la flecha a la derecha del botón de fusión y asegúrese de elegir rebase en lugar de fusionar. Luego haz clic en el botón. De esta manera, no producirá un compromiso de fusión innecesario.
  6. Hecho.
cakraww
fuente
0

Para sincronizar automáticamente su repositorio bifurcado con el repositorio principal, puede usar la aplicación Pull en GitHub.

Consulte el archivo Léame para obtener más detalles.

Para una configuración avanzada donde desea conservar los cambios realizados en el repositorio bifurcado, consulte mi respuesta en una pregunta similar aquí .

Saurabh P Bhandari
fuente