¿Cómo actualizo o sincronizo un repositorio bifurcado en GitHub?

Resuelto Lea Hayes asked hace 13 años • 31 respuestas

Bifurqué un proyecto, hice cambios y creé una solicitud de extracción que fue aceptada. Posteriormente se agregaron nuevas confirmaciones al repositorio. ¿Cómo consigo esos compromisos en mi bifurcación?

Lea Hayes avatar Aug 30 '11 20:08 Lea Hayes
Aceptado

En su clon local de su repositorio bifurcado, puede agregar el repositorio de GitHub original como "remoto". ("Remotos" son como apodos para las URL de los repositorios; origines uno, por ejemplo). Luego, puede recuperar todas las ramas de ese repositorio ascendente y rebase su trabajo para continuar trabajando en la versión ascendente. En términos de comandos, podrían verse así:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Si no desea reescribir el historial de su rama maestra (por ejemplo, porque otras personas pueden haberla clonado), entonces debe reemplazar el último comando con git merge upstream/master. Sin embargo, para realizar más solicitudes de extracción que sean lo más limpias posible, probablemente sea mejor cambiar la base.


Si ha cambiado la base de su rama, upstream/masteres posible que necesite forzar la inserción para poder enviarla a su propio repositorio bifurcado en GitHub. Harías eso con:

git push -f origin master

Solo necesitas usarlo -fla primera vez después de haber cambiado la base.

Mark Longair avatar Aug 30 '2011 14:08 Mark Longair

A partir de mayo de 2014, es posible actualizar una bifurcación directamente desde GitHub. Esto todavía funciona a partir de septiembre de 2017, PERO dará lugar a un historial de confirmaciones sucio.

  1. Abre tu bifurcación en GitHub.
  2. Haga clic en Pull Requests.
  3. Haga clic en New Pull Request. De forma predeterminada, GitHub comparará el original con tu bifurcación y no debería haber nada que comparar si no realizaste ningún cambio.
  4. Haga clic switching the basesi ve ese enlace. De lo contrario, configure manualmente el menú base forkdesplegable en su bifurcación y el menú head forkdesplegable en sentido ascendente. Ahora GitHub comparará su bifurcación con el original y debería ver los últimos cambios. ingrese la descripción de la imagen aquí
  5. Create pull requesty asigne un nombre predecible a su solicitud de extracción (por ejemplo, Update from original).
  6. Desplácese hacia abajo hasta Merge pull request, pero no haga clic en nada todavía.

Ahora tiene tres opciones, pero cada una conducirá a un historial de confirmaciones poco limpio.

  1. El valor predeterminado creará una fea confirmación de fusión.
  2. Si hace clic en el menú desplegable y elige "Aplastar y fusionar", todas las confirmaciones intermedias se combinarán en una. En la mayoría de los casos, esto es algo que no desea.
  3. Si hace clic en Rebase and merge, todas las confirmaciones se realizarán "con" usted, los PR originales se vincularán a su PR y GitHub mostrará This branch is X commits ahead, Y commits behind <original fork>.

Entonces, sí, puedes mantener tu repositorio actualizado con su flujo ascendente usando la interfaz de usuario web de GitHub, pero hacerlo manchará tu historial de confirmaciones. En su lugar , quédese con la línea de comando : es fácil.

lobzik avatar May 25 '2014 07:05 lobzik

Aquí está el documento oficial de GitHub sobre cómo sincronizar una bifurcación :

Sincronizando una bifurcación

La puesta en marcha

Antes de poder sincronizar, debe agregar un control remoto que apunte al repositorio ascendente. Es posible que hayas hecho esto cuando bifurcaste originalmente.

Consejo: sincronizar tu bifurcación solo actualiza tu copia local del repositorio; no actualiza su repositorio en GitHub.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Sincronización

Se requieren dos pasos para sincronizar su repositorio con el upstream: primero debe buscar desde el control remoto y luego debe fusionar la rama deseada con su rama local.

Atractivo

La recuperación del repositorio remoto traerá sus ramas y sus respectivas confirmaciones. Estos se almacenan en su repositorio local en ramas especiales.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Ahora tenemos la rama maestra del upstream almacenada en una rama local, upstream/master

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Fusionando

Ahora que hemos obtenido el repositorio ascendente, queremos fusionar sus cambios en nuestra sucursal local. Esto sincronizará esa rama con la anterior, sin perder nuestros cambios locales.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Si su sucursal local no tenía confirmaciones únicas, git realizará un "avance rápido":

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Consejo: Si deseas actualizar tu repositorio en GitHub, sigue las instrucciones aquí

jumpnett avatar Oct 21 '2013 23:10 jumpnett

Muchas respuestas terminan moviendo su bifurcación una confirmación por delante del repositorio principal. Esta respuesta resume los pasos que se encuentran aquí y que moverán su bifurcación al mismo compromiso que el padre .

  1. Cambie el directorio a su repositorio local.

    • Cambie a la rama maestra si no lo estágit checkout master
  2. Agregue el padre como repositorio remoto,git remote add upstream <repo-location>

  3. Asuntogit fetch upstream
  4. Asuntogit rebase upstream/master

    • En esta etapa, verifica que confirma lo que se fusionará escribiendogit status
  5. Asuntogit push origin master

Para obtener más información sobre estos comandos, consulte el paso 3 .

Sahar Rabinoviz avatar Aug 05 '2015 14:08 Sahar Rabinoviz

Si, como yo, nunca comprometes nada directamente con master , lo que realmente deberías hacer, puedes hacer lo siguiente.

Desde el clon local de tu bifurcación, crea tu control remoto ascendente. Sólo necesitas hacer eso una vez:

git remote add upstream https://github.com/whoever/whatever.git

Luego, cuando quiera ponerse al día con la rama maestra del repositorio ascendente, deberá:

git checkout master
git pull upstream master

Suponiendo que nunca hayas cometido nada en master, ya deberías haber terminado. Ahora puede enviar su maestro local a su bifurcación GitHub remota de origen. También puede cambiar la base de su rama de desarrollo en su maestro local ahora actualizado.

Después de la configuración inicial ascendente y la verificación del maestro, todo lo que necesita hacer es ejecutar el siguiente comando para sincronizar su maestro con el ascendente: git pull upstream master .

Slion avatar Jan 03 '2017 16:01 Slion