¿Cómo actualizo un repositorio bifurcado de GitHub?

3606

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

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 bifurcación cuando tenga que realizar más cambios? ¿O hay un botón de actualización?

Lea Hayes
fuente
120
Esto también se puede hacer desde la interfaz de usuario de github. Me gustaría dar crédito [a este otro póster] [1]. [1]: stackoverflow.com/a/21131381/728141
Mike Schroll
2
Otra buena publicación de blog sobre esto - Mantener una bifurcación de GitHub actualizada
Arup Rakshit
3
Encontré esto en los artículos de ayuda de Github: help.github.com/articles/syncing-a-fork
Pranav
2
¿Es este un duplicado de stackoverflow.com/questions/3903817/… ?
David Cary
Aquí hay una demostración de video que hace esto usando dos cuentas de github youtube.com/watch?v=kpE0gTX4ycE
lifebalance

Respuestas:

3983

En su clon local de su repositorio bifurcado, puede agregar el repositorio original de GitHub como "remoto". (Los "controles remotos" son como apodos para las URL de los repositorios; origines uno, por ejemplo). Luego, puede buscar todas las ramas de ese repositorio ascendente y volver a redactar su trabajo para continuar trabajando en la versión ascendente. 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 maestra (por ejemplo, porque otras personas pueden haberlo clonado), 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 volver a redactar.


Si ha reubicado su rama, upstream/masteres posible que deba forzar el empuje para empujarlo a su propio repositorio bifurcado en GitHub. Harías eso con:

git push -f origin master

Solo necesita usar -fla primera vez después de haber reescrito.

Mark Longair
fuente
94
Como su bifurcación solo existe en github, y github no tiene herramientas para realizar fusiones a través de la interfaz web, la respuesta correcta es hacer la fusión ascendente localmente y devolver los cambios a su bifurcación.
Tim Keating
29
Aquí hay un gran tutorial que encontré al trabajar con github: gun.io/blog/how-to-github-fork-branch-and-pull-request
Tim Keating
50
Una nota rápida de que, en lugar de tener que volver a crear su propia rama maestra para asegurarse de que está comenzando con un estado limpio, probablemente debería trabajar en una rama separada y hacer una solicitud de extracción a partir de eso. Esto mantiene a tu maestro limpio para futuras fusiones y evita que tengas que volver a escribir el historial con lo -fque se equivoca a todos los que podrían haber clonado tu versión.
Mateusz Kowalczyk
11
En lugar del comando rebase, utilicé lo siguiente: De git merge --no-ff upstream/masteresta manera, sus commits ya no están en la parte superior.
Steckdoserich
52
Otro fracaso de Git. Si se supone que estas herramientas son compatibles con la colaboración distribuida, ¿por qué es tan difícil realizar un flujo de trabajo básico? 4 millones de personas y 2200 votos positivos significan que la herramienta falló. "puede agregar el repositorio original de GitHub como" remoto " - ¿Por qué uno tiene que hacer esto? ¿Por qué no se hace durante la bifurcación? ¿Qué tiene de
malo
740

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 conducirá a un historial de confirmación sucio.

  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 switching the basesi ve ese enlace. De lo contrario, configure manualmente el base forkmenú desplegable en su bifurcación y el head forken la parte superior. Ahora GitHub comparará su bifurcación con el original, y debería ver todos 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ázate hacia abajo Merge pull request, pero aún no hagas clic en nada.

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

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

Entonces, sí, puede mantener actualizado su repositorio con su flujo ascendente utilizando la interfaz de usuario web de GitHub, pero hacerlo dañará su historial de confirmación. En cambio, quédese con la línea de comando : es fácil.

lobzik
fuente
19
Esto funcionó muy bien una vez. La segunda vez este proceso no funcionó de la misma manera: el enlace "Cambiar la base" no apareció. Y cuando presioné "Hacer clic para crear una solicitud de extracción", se creó un RP en el repositorio SOURCE. NO lo que quería ...
javadba
29
Todavía funciona (Marchi 2015), aunque el enlace "Cambiar la base" ya no está allí. Tienes que cambiar el menú desplegable "Base" para que ambos apunten a tu bifurcación y luego aparecerá el mensaje "Comparar entre repositorios", que te llevará a donde quieras.
mluisbrown
8
Abril de 2015. Obras. Gracias. Obtuve "Cambio a base". Sin embargo, el paso 6 fue "Crear solicitud de extracción" -> ingresar comentario -> "Crear solicitud de extracción". Termina con 1 commit antes del original.
cartland
55
@cartland (u otros): sí, dice "Esta rama es 1 compromiso antes de ..." ¿Es algo de lo que preocuparse? ¿Es posible deshacerse de ese mensaje?
RenniePet
11
¡no sería mejor con un simple botón de actualización o sincronización!
transformador
457

Aquí está el documento oficial de GitHub sobre Sincronizar una bifurcación :

Sincronizando un tenedor

La puesta en marcha

Antes de poder sincronizar, debe agregar un control remoto que apunte al repositorio ascendente. Es posible que haya hecho esto cuando originalmente se bifurcó.

Sugerencia: la sincronización de su bifurcación solo actualiza su 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

Hay dos pasos necesarios para sincronizar su repositorio con el flujo ascendente: primero debe buscar desde el control remoto, luego debe fusionar la rama deseada en su rama local.

Atractivo

La recuperación desde el repositorio remoto traerá sus ramas y sus respectivas confirmaciones. 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 del flujo ascendente almacenada en una rama local, flujo ascendente / maestro

$ 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 rama local. Esto sincronizará esa rama con el flujo 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 tenía ninguna confirmación única, 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(-)

Sugerencia: si desea actualizar su repositorio en GitHub, siga las instrucciones aquí

jumpnett
fuente
1
Esto actualiza mi bifurcación local, pero mi bifurcación en Github.com todavía dice "43 confirma detrás". Tuve que usar la técnica de lobzik para crear una solicitud de extracción para mí mismo para fusionar los cambios maestros en mi tenedor Github.com.
Michael McGinnis
11
@MichaelMcGinnis Después de fusionarse localmente, tendría que llevar sus cambios a github. git push origin master
jumpnett
1
Puede ser inteligente para impulsar con --follow-tags: stackoverflow.com/a/26438076/667847
kenny
1
Tengo que hacerlo para todas las ramas por separado git merge upstream/master, luego echar un vistazo para desarrollar una rama y hacerlogit merge upstream/develop
Shobi
stackoverflow.com/a/14074925/470749 fue útil para mí porque lo estaba obteniendo Permission denied (publickey). fatal: Could not read from remote repository.al intentar buscar desde la cuenta de Github de Facebook en sentido ascendente.
Ryan
98

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

  1. Cambie el directorio a su repositorio local.

    • Cambie a la rama maestra 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, verifica que confirma lo que se fusionará escribiendo git status
  5. Problema git push origin master

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

Sahar Rabinoviz
fuente
13
@MT: ¿Dónde ingresas estos comandos? La esencia de la pregunta, según tengo entendido, es cómo resincronizar su bifurcación personal de GitHub con el proyecto principal, y hacer todo esto desde GitHub . En otras palabras, ¿cómo puede actualizar su bifurcación remota sin un repositorio local?
John Y
44
@JohnY Usar GitHub siempre creará una confirmación adicional. Debe hacer todo esto en un shell en un repositorio local para evitar esa confirmación adicional.
Jonathan Cross
49

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

Desde el clon local de su bifurcación, cree su control remoto ascendente. Solo 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, debe:

git checkout master
git pull upstream master

Asumiendo que nunca has cometido nada sobre el maestro, ya deberías haberlo hecho. Ahora puede empujar a su maestro local a su bifurcación remota GitHub 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 comprobación principal, todo lo que necesita hacer es ejecutar el siguiente comando para sincronizar su maestro con el ascendente: git pull upstream master .

Slion
fuente
48

Prólogo: su bifurcación es el "origen" y el repositorio desde el que se bifurcó es el "ascendente".

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

git clone [email protected]:your_name/project_name.git
cd project_name

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

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

    git remote add upstream [email protected]:original_author/project_name.git
    
  2. Obtenga los commits (y las ramas) del "upstream":

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

    git checkout master
    
  4. Guarda los cambios de tu rama "maestra":

    git stash
    
  5. Combine los cambios de la rama "maestra" de la "corriente arriba" en su rama "maestra" de su "origen":

    git merge upstream/master
    
  6. Resolver conflictos de fusión, si los hay, y confirmar 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. Ya terminaste! ¡Felicidades!

GitHub también proporciona instrucciones para este tema: Sincronizar una bifurcación

Benny Neugebauer
fuente
1
Ayudado en parte: ¿es git remote add upstream [email protected]:original_author/project_name.gitsolo un alias para git remote add upstream https://github.com/original_author/project_name.git?
Wolf
2
Wolf , supongo que ya lo sabes, pero para la posteridad ... Es el formato para ssh. help.github.com/articles/configuring-a-remote-for-a-fork
Brad Ellis
2
Muchas gracias. git stashy git stash popparte muy útil
जयते जयते
Esto funcionó. Después de git merge upstream / master, la fusión automática falló debido a las rutas no fusionadas que tuve que ejecutar git add -A luego git commit -m "message" y luego estaba actualizado.
highcenbug
45

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 una bifurcación local sincronizada con el flujo ascendente:

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

Nota: Dado que la solicitud de función no es oficial, también es aconsejable ponerse [email protected]en contacto para agregar su soporte para que se implemente una función como esta. La solicitud de características no oficiales anterior podría usarse como evidencia del monto de interés en esta implementación.

isedwards
fuente
23

A la fecha de esta respuesta, GitHub no tiene ( o debo decir que ya no? ) Esta característica en la interfaz web. Sin embargo, puede solicitar [email protected]agregar su voto para eso.

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

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

Lucero
fuente
2
Si bien encuentro que la herramienta es una buena idea, la realidad es que está ROTA. Cargó solo 20 repos de mi cuenta e incluso el pie de página redirige a un sitio web que no existe. Si eso se soluciona, seré un gran defensor.
sorin
2
A partir de hoy, he utilizado con éxito upriver para sincronizar una bifurcación con el repositorio upstream, por lo que funciona para mis propósitos y continuaré usándolo.
NauticalMile
1
@sorin Estas limitaciones de 20 repos / ramificaciones (más bien, ahora son 30) provienen de la configuración de paginación predeterminada de GitHub. Es necesario que haya algunas adaptaciones al código para manejar esto.
Andreas
19

Si está utilizando GitHub para Windows o Mac, ahora tienen una función de un clic para actualizar las horquillas:

  1. Seleccione el repositorio en la interfaz de usuario.
  2. Haga clic en el botón "Actualizar desde usuario / sucursal" en la parte superior.
Shital Shah
fuente
11

En realidad, es posible crear una bifurcación en su bifurcación a partir de cualquier confirmación del flujo ascendente en el navegador:

  • Abierto https://github.com/<repo>/commits/<hash>, donde el repositorio es su bifurcación, y el hash es el hash completo de commit que puede encontrar en la interfaz web ascendente. Por ejemplo, puedo abrir https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 , que apunta al linux mastermomento de la escritura.
  • Haga clic en el botón "Árbol: ....".
  • Escriba el nombre de la nueva sucursal y presione Enter

Ingrese la descripción de la imagen aquí

Luego puede buscar esa rama en su clon local, y no tendrá que enviar todos esos datos de nuevo a GitHub cuando inserte ediciones encima de esa confirmación. O use la interfaz web para cambiar algo en esa rama.

Cómo funciona (es una suposición, no sé exactamente cómo lo hace GitHub): los tenedores comparten el almacenamiento de objetos y usan espacios de nombres para separar las referencias de los usuarios. Por lo tanto, puede acceder a todas las confirmaciones a través de su bifurcación, incluso si no existían en el momento de la bifurcación.

max630
fuente
2
¡Esto es genial! Esto evita la carga totalmente inútil de esos commits a github.
Rotsor
9

Sigue los pasos a continuación. Los probé y me ayudó.

Pago a su sucursal

Sintaxis: git branch yourDevelopmentBranch
Ejemplo: git checkout master

Tire de la rama del repositorio de origen para obtener el último código

Sintaxis: git pull https://github.com/tastejs/awesome-app-ideas master
Ejemplo: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

Venkat.R
fuente
1
Si está utilizando GitHub, es posible que también desee enviar los cambios a su rama de GitHub. git push HttpsForYourForkOfTheRepo BRANCH_NAME
user3731622
9

Actualizo mis repositorios bifurcados con esta línea:

git pull https://github.com/forkuser/forkedrepo.git branch

Use esto si no desea agregar otro punto final remoto a su proyecto, como otras soluciones publicadas aquí.

R.Bravo
fuente
2
¿Hay limitaciones en esto? es decir, ¿se aplica solo a los casos en los que no ha agregado confirmaciones, fusiones, solicitudes de extracción o si las solicitudes de extracción se han fusionado en sentido ascendente desde la última actualización?
LightCC
1
funciona como un tirón normal desde una rama remota. Si realizó X commits en su repositorio local y ahora está Y commits detrás del repositorio original, traerá los Y commits a su sucursal local y, probablemente, obtendrá algunos conflictos para resolver.
R.Bravo
1
@LightCC Esto no es diferente a extraer de un control remoto agregado previamente, excepto por el hecho de que no ha agregado un control remoto . Entonces, la desventaja es que tendrá que ingresar la URL del repositorio completo cada vez que lo desee pull.
Marc.2377
1
Esta es una solución perfecta si no tiene que extraer muchas veces del repositorio original, o si el proyecto bifurcado es relativamente simple.
AxeEffect
7

Como complemento a esta respuesta, estaba buscando una manera de actualizar todas las ramas remotas de mi repositorio clonado ( origen ) desde las ramas aguas arriba de una sola vez. Así es como lo hice.

Esto supone que ya ha configurado un apuntamiento remoto ascendente en el repositorio de origen (desde donde se bifurcó el origen ) y lo ha sincronizado git fetch upstream.

Entonces corre:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

La primera parte de este comando enumera todas las cabezas en el repositorio remoto ascendente y elimina el SHA-1 seguido del refs/heads/prefijo de nombre de rama.

Luego, para cada una de estas ramas, empuja la copia local de la rama de seguimiento remoto ascendente ( refs/remotes/upstream/<branch>en el lado local) directamente a la rama remota en el origen ( refs/heads/<branch>en el lado remoto).

Cualquiera de estos comandos de sincronización de bifurcación puede fallar por una de dos razones: o la bifurcación ascendente se ha reescrito o usted ha enviado confirmaciones en esa bifurcación a su bifurcación. En el primer caso en el que no ha comprometido nada con la bifurcación en su bifurcación, es seguro presionar con fuerza (agregue el interruptor -f ; es decir, git push -fen el comando anterior). En el otro caso, esto es normal ya que la bifurcación de su bifurcación se ha desviado y no puede esperar que el comando de sincronización funcione hasta que sus confirmaciones se hayan fusionado nuevamente en sentido ascendente .

Thomas Guyot-Sionnest
fuente
6

La aplicación "Pull" es una solución automática de configuración y olvido. Sincronizará la rama predeterminada de su bifurcación con el repositorio ascendente.

Visite la URL, haga clic en el botón verde "Instalar" y seleccione los repositorios donde desea habilitar la sincronización automática.

La rama se actualiza una vez por hora directamente en GitHub, en su máquina local necesita extraer la rama maestra para asegurarse de que su copia local esté sincronizada.

krlmlr
fuente
2
Tenga en cuenta que con la configuración básica, puede perder los cambios realizados en su repositorio bifurcado. Para mantener los cambios, configure un archivo de configuración y especifique a mergemethod. Más sobre esto aquí
Saurabh P Bhandari
1
Noté que la configuración básica envía solicitudes de extracción y las fusiona (a diferencia de lo que se indica en la documentación). ¿Esto es un poco molesto pero resuelve el problema de pérdida de datos?
krlmlr
4

Android Studio ahora ha aprendido a trabajar con repositorios de fork de GitHub (ni siquiera tiene que agregar un repositorio remoto "ascendente" por comando de consola).

Abrir menú VCSGit

Y preste atención a los dos últimos elementos del menú emergente:

  • Rebase mi tenedor GitHub

  • Crear solicitud de extracción

Pruébalos. Utilizo el primero para sincronizar mi repositorio local. De todos modos, las ramas del repositorio remoto principal ("upstream") estarán accesibles en Android Studio después de hacer clic en "Rebase my GitHub fork", y podrá operar con ellas fácilmente.

(Uso Android Studio 3.0 con los complementos "Integración Git" y "GitHub").

Ingrese la descripción de la imagen aquí

alexshr
fuente
4

Cuando haya clonado su repositorio bifurcado, vaya a la ruta del directorio donde reside su clon y las pocas líneas en su Terminal de Git Bash.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

Y ahí estás listo para ir. Todos los cambios actualizados en el repositorio principal se incluirán en el repositorio de fork.

El comando "buscar" es indispensable para mantenerse actualizado en un proyecto: solo cuando realice una "búsqueda de git" se le informará sobre los cambios que sus colegas introdujeron en el servidor remoto.

Todavía puede visitar aquí para más consultas.

Prateek Chanda
fuente
4

Si configura su upstream. Consulte con git remote -v, entonces esto será suficiente.

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push
prosti
fuente
2

Eso depende del tamaño de su repositorio y de cómo lo bifurcó.

Si es un repositorio bastante grande, es posible que haya querido administrarlo de una manera especial (por ejemplo, el historial de descartes). Básicamente, puede obtener diferencias entre las versiones actuales y ascendentes, confirmarlas y luego volver a elegir el maestro.

Intenta leer este . Describe cómo manejar grandes repositorios de Git y cómo actualizarlos con los últimos cambios.

s0nicYouth
fuente
2

Me gustaría agregar a la respuesta de @ krlmlr .

Inicialmente, el repositorio ha bifurcado una rama llamada: master. Si está trabajando en una nueva característica o una solución, generalmente crearía una nueva rama featurey haría los cambios.

Si desea que el repositorio bifurcado esté sincronizado con el repositorio principal, puede configurar un archivo de configuración ( pull.yml) para la aplicación Pull ( en la rama de funciones ), de esta manera:

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

Esto mantiene masteractualizada la rama del repositorio bifurcado con el repositorio principal. Mantiene la featurerama del repositorio bifurcado actualizada a través de la mastersucursal del repositorio bifurcado fusionando la misma. Esto supone que la featurerama es la rama predeterminada que contiene el archivo de configuración.

Aquí mergemethodshay dos en juego, uno es el hardresetque ayuda a forzar los cambios de sincronización en la masterrama del repositorio bifurcado con el repositorio principal y el otro método es merge. Este método se utiliza para fusionar los cambios realizados por usted en la featurerama y los cambios realizados debido a la sincronización forzada en la masterrama. En caso de conflicto de fusión, la aplicación de extracción le permitirá elegir el próximo curso de acción durante la solicitud de extracción.

Puede leer sobre configuraciones básicas y avanzadas y varias mergemethods aquí .

Actualmente estoy usando esta configuración en mi repositorio bifurcado aquí para asegurarme de que una mejora solicitada aquí se mantenga actualizada.

Saurabh P Bhandari
fuente
1

Hay dos cosas principales para mantener un repositorio bifurcado siempre actualizado para siempre.

1. Cree las ramas desde la bifurcación maestra y realice los cambios allí .

Entonces, cuando se acepte su solicitud de extracción, puede eliminar de forma segura la sucursal, ya que su código contribuido estará en vivo en su maestro de su repositorio bifurcado cuando lo actualice con el flujo ascendente. Con esto, su maestro siempre estará en condiciones de limpieza para crear una nueva rama para hacer otro cambio.

2. Cree un trabajo programado para que el maestro de horquillas se actualice automáticamente .

Esto se puede hacer con cron . Aquí hay un código de ejemplo si lo hace en Linux.

$ crontab -e

ponga este código en crontab filepara ejecutar el trabajo por hora.

0 * * * * sh ~/cron.sh

luego cree el cron.sharchivo de script y una interacción git con ssh-agent y / o espere de la siguiente manera

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="[email protected]:<username>/$REPOSITORY.git"   
[email protected]:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

Verifique su repositorio bifurcado. De vez en cuando siempre mostrará esta notificación:

Esta rama es incluso con <upstream>: maestro .

ingrese la descripción de la imagen aquí

Chetabahana
fuente
0

Use estos comandos (en caso de suerte)

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
Do Nhu Vy
fuente