¿Cómo actualizo o sincronizo un repositorio bifurcado en GitHub?
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?
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; origin
es 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/master
es 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 -f
la primera vez después de haber cambiado la base.
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.
- Abre tu bifurcación en GitHub.
- Haga clic en Pull Requests.
- 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.
- 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.
- Create pull requesty asigne un nombre predecible a su solicitud de extracción (por ejemplo,
Update from original
). - 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.
- El valor predeterminado creará una fea confirmación de fusión.
- 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.
- 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.
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í
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 .
Cambie el directorio a su repositorio local.
- Cambie a la rama maestra si no lo está
git checkout master
- Cambie a la rama maestra si no lo está
Agregue el padre como repositorio remoto,
git remote add upstream <repo-location>
- Asunto
git fetch upstream
Asunto
git rebase upstream/master
- En esta etapa, verifica que confirma lo que se fusionará escribiendo
git status
- En esta etapa, verifica que confirma lo que se fusionará escribiendo
Asunto
git push origin master
Para obtener más información sobre estos comandos, consulte el paso 3 .
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 .