¿Cómo puedo mantener mi horquilla sincronizada sin agregar un control remoto por separado?


302

Supongamos que hay un repositorio someone/foobaren GitHub, al que me bifurqué me/foobar.

¿Cómo extraigo nuevos commits del repositorio principal directamente a mi fork , sin tener que agregar un control remoto por separado y recordar extraer regularmente desde allí ?

La meta es:

  • git pull para buscar desde el repositorio principal
  • git push para enviar todo a mi tenedor

26
La sorprendente respuesta de @Olufemi parece hacer lo que quieres, excepto que, como ChristianGosch señala en un comentario, terminas con un "compromiso de fusión" en la parte superior de tu rama, y ​​no aparecerá "nada para comparar". Eso parece inaceptable para muchos proyectos para los que desea hacer sucursales para que tomen. Entonces, ¿realmente no hay forma de hacer este flujo de trabajo de contribuidor más básico en github sin ejecutar comandos arcane git en una computadora personal? ¿O tal vez debería tirar todo mi repositorio y volver a bifurcar cada vez que quiera contribuir?
nealmcb




@nealmcb ¿No se evita el problema con un "compromiso de fusión" en la parte superior de su rama si cambia la base?
Marko

Respuestas:


586

Abra el repositorio bifurcado de Git me / foobar .

Haga clic en Comparar :

Aquí hay una imagen de muestra de la página.

Recibirá la notificación:

No hay nada para comparar.
alguien: maestro está al día con todos los compromisos de mí: maestro . Intente cambiar la base para su comparación.

Haga clic en cambiar la base en esta página:

Aquí hay un ejemplo en la página.

Luego, puede ver todos los compromisos realizados con alguien / foobar después del día en que lo bifurcó.

Haga clic en Crear solicitud de extracción :

Aquí hay una página de muestra

Dé un título a la solicitud de extracción y tal vez una descripción y haga clic en Crear solicitud de extracción .

En la página siguiente, desplácese hasta la parte inferior de la página y haga clic en Combinar solicitud de extracción y Confirmar fusión .

Tu repositorio Git me / foobar se actualizará.

Editar: las opciones de rebase se muestran aquí:

ingrese la descripción de la imagen aquí


50
Esto es confuso porque cuando cambia la base github lo arroja a la página para el repositorio original, por lo que parece que está abriendo una solicitud de extracción en la bifurcación aguas arriba. Pero funciona totalmente.
Eduardo

8
Para evitar la situación confusa mencionada anteriormente, será mejor que haga clic en el Editbotón y cambie manualmente base forka me/foobary head forkpara someone/foobar. De esta manera queda mucho más claro
macemers el

26
Otro: Esto funciona bien si no lo hiciste antes, pero luego está el "Merge commit" en la parte superior de tu historial de commit. Por lo tanto, "nada para comparar" no aparecerá. En su lugar, uno debe usar el botón "Editar" e intercambiar manualmente la base y la horquilla para que esto funcione.
Christian Gosch

26
¿No hay forma de deshacerse de ese ridículo compromiso de fusión?
kumarharsh

17
@kumar_harsh desde septiembre de 2016 , ahora hay una opción de "rebase y fusión" para las solicitudes de extracción que evita la confirmación de fusión.
waldyrious

41
git remote set-url origin git@github.com:someone/foobar
git remote set-url origin --push git@github.com:me/foobar

Sin embargo, hay una advertencia:
esto es perfecto si usted es el único que realiza cambios en su bifurcación.
Sin embargo, si se comparte con otras personas, es posible que deba retirarse de la bifurcación, en cuyo caso un único control remoto es la única solución.

Editar:
En realidad, se puede git pull git@github.com:me/foobar , lo que elimina la salvedad.
La elección es suya en cuanto a cuál es más fácil de recordar.


8

Utilicé un método bastante simple usando la interfaz de usuario web de GitHub para hacer eso:

  1. Abra el repositorio Git original (no el repositorio Git bifurcado me/foobar)
  2. Vaya a la carpeta src y abra el archivo que desea cambiar.
  3. Haz clic en el ícono de la pluma. Creará automáticamente una etiqueta en su bifurcación personal llamada "parche-1" basada en la versión actual del repositorio principal: Ingrese la descripción de la imagen aquí
  4. ¡Disfrutar! Ingrese la descripción de la imagen aquí

3
Al intentar esto, básicamente se abre el editor en el archivo en el repositorio original de git. No tengo privilegio de escritura (por diseño) en el repositorio original de git. Parece que para este método debe cambiar el archivo, de lo contrario no hay forma de "guardar" el archivo. Sin guardar el archivo, no podría obtener su equivalente de la rama "parche-1" para que aparezca en mi repositorio bifurcado. ¿Que me estoy perdiendo aqui?
Electro-Bunny

5

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.

También respondió en https://stackoverflow.com/a/58965171/946850 .


1

Otra opción es usar el Update from upstreamRepoName/masterbotón en GitHub para Mac (y supongo que GitHub para Windows).

Ingrese la descripción de la imagen aquí


TIL: que hay aplicaciones para GitHub más allá de la interfaz web :-) [y es una pena que la experiencia en ellas no esté unificada]
Tom Goodfellow

No veo esto en Windows
Denis

1
@ Denis esta es su antigua aplicación. No estoy seguro de que su nueva aplicación lo tenga.
Steve Moser

Ajá. Esto funcionó en "GitHub Desktop" (para Mac, no estoy seguro acerca de Windows).
michaelok

0

No sé cómo se puede hacer sin agregar otro control remoto, sin embargo, siempre agrego el repositorio que bifurqué como upstreamcontrol remoto para poder simplemente hacer:

git branch -a|grep remotes/upstream| while IFS="/" read p r b; do echo Syncing $r/$b to origin/$b; git push origin $r/$b:refs/heads/$b; done

Esto sincronizará todas las ramas incl. creando nuevas (elimine refs/heads/para actualizar solo las ramas existentes). Si alguna de sus ramas ha divergido, arrojará un error para esa rama.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.