Pregunta ¿Cómo actualizo un repositorio bifurcado de GitHub?


Recientemente bifurqué un proyecto y apliqué varias correcciones. Luego creé una solicitud de extracción que luego se aceptó.

Unos días después, otro contribuyente hizo otro cambio. Entonces mi tenedor no contiene ese cambio.

¿Cómo puedo obtener ese cambio en mi tenedor? ¿Debo eliminar y volver a crear mi tenedor cuando tenga más cambios para contribuir? ¿O hay un botón de actualización?


2829
2017-08-30 13:53


origen


Respuestas:


En su clon local de su repositorio bifurcado, puede agregar el repositorio original de GitHub como "remoto". ("Remotos" son como apodos para las URL de los repositorios - origin es uno, por ejemplo.) Luego puede buscar todas las ramas de ese repositorio en sentido ascendente y volver a establecer la base de su trabajo para continuar trabajando en la versión anterior. En términos de comandos que 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,
# such as upstream/master:

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 principal (por ejemplo, porque otras personas lo hayan clonado), debe reemplazar el último comando por git merge upstream/master. Sin embargo, para realizar más solicitudes de extracción que estén lo más limpias posible, probablemente sea mejor volver a establecer la base.


Si ha vuelto a basar su rama en upstream/master es posible que necesite forzar el impulso para insertarlo en su repositorio bifurcado en GitHub. Lo harías con:

git push -f origin master

Solo necesitas usar el -f la primera vez después de que haya sido rediseñado.


3098
2017-08-30 14:01



A partir de mayo de 2014, es posible actualizar una horquilla directamente desde GitHub. Esto todavía funciona a partir de septiembre de 2017, PERO conducirá a un historial de commit sucio.

  1. Abre tu tenedor en GitHub.
  2. Haga clic en Solicitudes de extracción.
  3. Haga clic en Nueva solicitud de extracción. Por defecto, GitHub comparará el original con su tenedor, y no debería haber nada para comparar si no hizo ningún cambio.
  4. Hacer clic cambiando la base si ves ese enlace De lo contrario, configure manualmente el tenedor de base desplázate hacia tu tenedor, y tenedor de cabeza a la corriente arriba Ahora GitHub comparará tu tenedor con el original, y deberías ver todos los últimos cambios. enter image description here
  5. Crear solicitud de extracción y asigne un nombre predecible a su solicitud de extracción (p. ej., Update from original)
  6. Desplácese hacia abajo para Solicitud de extracción de combinación, pero no hagas clic en nada todavía.

Ahora tiene tres opciones, pero cada una conducirá a un historial de compromiso menos que limpio.

  1. El valor predeterminado creará una fea fusión de confirmación.
  2. Si haces clic en el menú desplegable y seleccionas "Squash and merge", todas las confirmaciones intermedias se agruparán en una. Esto es más a menudo algo que no quieres.
  3. Si haces clic Rebase y combine, todas las confirmaciones se realizarán "con" usted, las RP originales se vincularán a su PR, y GitHub mostrará This branch is X commits ahead, Y commits behind <original fork>.

Así que sí, puedes mantener tu repositorio actualizado con su upstream usando la interfaz de usuario web de GitHub, pero al hacerlo estropeará tu historial de confirmaciones. Atenerse a la linea de comando en cambio, es fácil.


642
2018-05-25 07:31



Aquí está el documento oficial de GitHub en Sincronizando un tenedor:

Sincronizando un tenedor

La puesta en marcha

Antes de que pueda sincronizar, necesita agregar un control remoto que apunta al repositorio aguas arriba. Es posible que haya hecho esto cuando originalmente se bifurcó.

Consejo: Sincronizar tu tenedor 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)

Sincronizando

Se requieren dos pasos para sincronizar su repositorio con el flujo ascendente: primero debe obtener desde el control remoto, luego debe fusionar la rama deseada en su sucursal local.

Atractivo

La obtención del repositorio remoto traerá sus ramas y sus respectivos commits. Estos se almacenan en su repositorio local bajo 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 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

Fusión

Ahora que hemos obtenido el repositorio en sentido ascendente, queremos fusionar sus cambios en nuestra sucursal local. Esto pondrá a esa rama en sincronización con la corriente ascendente, 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 tiene commits únicos, en cambio, 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 desea actualizar su repositorio en GitHub, siga las instrucciones aquí


365
2017-10-21 23:04



Muchas respuestas terminan moviendo tu tenedor uno comprometerse por delante del repositorio padre Esta respuesta resume los pasos encontrados aquí que lo hará mueva su tenedor al mismo compromiso que el padre.

  1. Cambie el directorio a su repositorio local.

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

  3. Problema git fetch upstream
  4. Problema git rebase upstream/master

    • En esta etapa, comprueba que confirma lo que se fusionará escribiendo git status
  5. Problema git push origin master

Para obtener más información acerca de estos comandos, consulte paso 3.


81
2017-08-05 14:59



Desde noviembre de 2013 se ha abierto una solicitud de función no oficial con GitHub para pedirles que agreguen un método muy simple e intuitivo para mantener un fork local sincronizado con el upstream:

https://github.com/isaacs/github/issues/121

Nota: Como la solicitud de función no es oficial, también es aconsejable ponerse en contacto con support@github.com para agregar su soporte para una característica como esta a ser implementada. La solicitud de característica no oficial anterior se podría utilizar como evidencia de la cantidad de interés en que esto se implemente.


39
2018-02-21 10:42



Prefacio: Su tenedor es el "origen" y el repositorio del que se bifurcó es el "ascendente".

Supongamos que ya clonaste tu tenedor en tu computadora con un comando como este:

git clone git@github.com:your_name/project_name.git
cd project_name

Si eso se da, entonces debes continuar en este orden:

  1. Agregue el "upstream" a su repositorio clonado ("origen"):

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Obtenga los commits (y branches) del "upstream":

    git fetch upstream
    
  3. Cambie a la rama "maestra" de su tenedor ("origen"):

    git checkout master
    
  4. Muestre los cambios de su rama "maestra":

    git stash
    
  5. Combina los cambios desde la rama "principal" de "ascendente" en tu rama "maestra" de tu "origen":

    git merge upstream/master
    
  6. Resuelva los conflictos de fusión si los hay y comprométase su fusión

    git commit -am "Merged from upstream"
    
  7. Empuja los cambios a tu tenedor

    git push
    
  8. Recupere sus cambios escondidos (si los hay)

    git stash pop
    
  9. ¡Terminaste! ¡Felicidades!

GitHub también proporciona instrucciones para este tema: Sincronizando un tenedor


29
2018-03-16 12:24



A partir de la fecha de esta respuesta, GitHub no tiene (¿O ya no diré más?) esta característica en la interfaz web. Puedes, sin embargo, preguntar support@github.com para agregar tu voto para eso.

Mientras tanto, el usuario de GitHub bardiharborow ha creado una herramienta para hacer esto: https://upriver.github.io/

La fuente está aquí: https://github.com/upriver/upriver.github.io


21
2017-09-14 14:22



Si, como yo, tú nunca comprometer nada directamente para dominar, lo que realmente debería hacer, puede hacer lo siguiente.

Desde el clon local de tu tenedor, crea tu control remoto aguas arriba. Solo necesitas hacer eso una vez:

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

Entonces, cuando quiera ponerse al día con la rama principal del repositorio en sentido ascendente, necesita:

git checkout master
git pull upstream master

Asumiendo que nunca has cometido nada sobre el maestro, deberías haberlo hecho ya. Ahora puede enviar su maestro local a su tenedor GitHub remoto de origen. También puede volver a establecer la base de su rama de desarrollo en su maestro local actualizado.

Por lo tanto, más allá de la configuración inicial inicial y del pago maestro, todo lo que necesita hacer es ejecutar el siguiente comando para sincronizar su maestro con el flujo ascendente: git pull upstream master.


21
2018-01-03 16:59