Bifurcación vs. Ramificación en GitHub

278

Me gustaría saber más sobre las ventajas y desventajas de bifurcar un proyecto github frente a crear una rama de un proyecto github.

Forking hace que mi versión del proyecto esté más aislada del original porque no tengo que estar en la lista de colaboradores del proyecto original. Dado que estamos desarrollando un proyecto interno, no hay ningún problema en agregar personas como colaboradores. Pero, nos gustaría entender si bifurcar un proyecto haría que los cambios de fusión al proyecto principal fueran más difíciles. Es decir, me pregunto si la ramificación facilita la sincronización de los dos proyectos. En otras palabras, ¿es más fácil fusionar e impulsar cambios entre mi versión del proyecto principal y el proyecto principal cuando me ramifico?

reprogramador
fuente

Respuestas:

280

No siempre puede crear una rama o extraer una rama existente y volver a ella, porque no está registrado como colaborador para ese proyecto específico.

La bifurcación no es más que un clon en el lado del servidor GitHub :

  • sin la posibilidad de retroceder directamente
  • con función de cola de horquilla agregada para administrar la solicitud de fusión

Mantiene una bifurcación sincronizada con el proyecto original al:

  • Agregar el proyecto original como control remoto
  • ir regularmente desde ese proyecto original
  • recalifique su desarrollo actual sobre la rama de interés que recibió de esa búsqueda.

El rebase le permite asegurarse de que sus cambios sean sencillos (sin conflictos de fusión para manejar), lo que hace que su solicitud de extracción sea más fácil cuando desea que el responsable del proyecto original incluya sus parches en su proyecto.

El objetivo es realmente permitir la colaboración, aunque la participación directa no siempre es posible.


El hecho de que clones en el lado de GitHub significa que ahora tienes dos repositorios "centrales" ("centrales" como "visibles desde varios colaboradores).
Si puedes agregarlos directamente como colaborador para un proyecto, no necesitas administrar otro uno con un tenedor.

tenedor en GitHub

La experiencia de fusión sería casi la misma, pero con un nivel adicional de indirección (presione primero en la horquilla, luego solicite un tirón, con el riesgo de evoluciones en el repositorio original haciendo que sus fusiones de avance rápido ya no avancen más) .
Eso significa que el flujo de trabajo correcto es git pull --rebase upstream(volver a basar su trabajo en la parte superior de las nuevas confirmaciones desde el inicio), y luego git push --force origin, para reescribir el historial de tal manera que sus propias confirmaciones siempre estén por encima de las confirmaciones del repositorio original (ascendente) .

Ver también:

VonC
fuente
3
Estamos desarrollando un proyecto en casa y no hay ningún problema en agregar personas como colaboradores. Pero, nos gustaría entender si bifurcar un proyecto dificultaría la fusión de los cambios al proyecto principal.
reprogramador
77
@reprogrammer: si puede agregar colaboradores, no es necesario bifurcar. pueden cambiar de base localmente y luego fusionarse en la rama de destino, y luego empujar directamente a un repositorio central, en lugar de tener que administrar dos repositorios centrales (el original y la bifurcación). El rebase sería casi el mismo, pero con una indirección adicional cuando se trata de un fork. De nuevo: no es necesario aquí. He actualizado mi respuesta.
VonC
14
Honestamente, incluso si no tiene que hacerlo, siempre es una buena idea tener un repositorio sagrado que se pueda escribir solo para desarrolladores senior, líderes de equipo u otras personas "confiables" . Todos los demás miembros del equipo deben trabajar en sus horquillas (~ cajas de arena) y contribuir con sus cambios en forma de solicitud de extracción. Dado que DVCS lo hace posible, lo adaptamos como una "mejor práctica" y lo usamos con éxito incluso en los proyectos más pequeños ...
desde el
1
@intland, ¿está más a favor de un "flujo de trabajo del administrador de integración" como se describe en stackoverflow.com/users/6309/vonc?tab=responses entonces? Por haber introducido a Git en un gran grupo, tiendo a adoptar primero un flujo de trabajo centralizado (más familiar para todos), antes de pasar a uno de "Administrador de integración".
VonC
15
Deberíamos llamar a las horquillas "ramitas", ya que se rompen de una rama y se utilizan para comenzar un árbol completamente nuevo. Solo mis dos centavos: me gusta el idioma arbóreo.
Eric
67

Aquí están las diferencias de alto nivel:

Bifurcación

Pros

  • Mantiene las ramas separadas por usuario
  • Reduce el desorden en el repositorio primario
  • El proceso de su equipo refleja el proceso del contribuyente externo

Contras

  • Hace que sea más difícil ver todas las ramas que están activas (o inactivas, para el caso)
  • Colaborar en una sucursal es más complicado (el propietario de la bifurcación debe agregar a la persona como colaborador)
  • Necesitas entender el concepto de múltiples controles remotos en Git
    • Requiere contabilidad mental adicional
    • Esto hará que el flujo de trabajo sea más difícil para las personas que no están muy cómodas con Git

Derivación

Pros

  • Mantiene todo el trabajo realizado alrededor de un proyecto en un solo lugar
  • Todos los colaboradores pueden ir a la misma sucursal para colaborar en ella.
  • Solo hay un control remoto Git con el que lidiar

Contras

  • Las ramas que se abandonan pueden acumularse más fácilmente
  • El proceso de contribución de su equipo no coincide con el proceso de contribución externa
  • Debe agregar miembros del equipo como contribuyentes antes de que puedan ramificarse
Aidan Feldman
fuente
¿Qué se entiende por "el proceso del contribuyente externo"?
Kars Barendrecht
1
@KarsBarendrecht Actualizado para usar el término "colaborador externo". Alguien que no tiene writepermisos en el repositorio.
Aidan Feldman
45

Tiene que ver con el flujo de trabajo general de Git. Es poco probable que pueda acceder directamente al repositorio del proyecto principal. No estoy seguro de si el repositorio del proyecto GitHub admite el control de acceso basado en sucursales, ya que no querrá otorgar a nadie el permiso para pasar a la rama maestra, por ejemplo.

El patrón general es el siguiente:

  • Bifurque el repositorio del proyecto original para tener su propia copia de GitHub, a la que luego se le permitirá enviar cambios.
  • Clone su repositorio GitHub en su máquina local
  • Opcionalmente, agregue el repositorio original como un repositorio remoto adicional en su repositorio local. Entonces podrá recuperar los cambios publicados en ese repositorio directamente.
  • Realice sus modificaciones y sus propios compromisos localmente.
  • Envíe sus cambios a su repositorio de GitHub (ya que generalmente no tendrá los permisos de escritura en el repositorio del proyecto directamente).
  • Póngase en contacto con los encargados del mantenimiento del proyecto y pídales que busquen sus cambios y revisen / fusionen, y dejen que regresen al repositorio del proyecto (si usted y ellos lo desean).

Sin esto, es bastante inusual que los proyectos públicos permitan que cualquiera empuje sus propios compromisos directamente.

Bruno
fuente
@RecoJohnson, bueno ... no he usado la palabra "pull" en mi respuesta (pero "pull" es efectivamente "buscar" + "fusionar" en términos de Git). ¿Qué uso de "push" crees que está mal?
Bruno
2
@RecoJohnson Usted, como colaborador, empuja a su bifurcación de GitHub; Los encargados del proyecto sacan su contribución de su tenedor.
mljrg
1
Creo que la suposición de que es poco probable que se le asigne un colaborador es más cierto en el mundo de código abierto que en muchas organizaciones con equipos de desarrollo que ahora usan git donde el equipo de desarrollo está bien definido. Creo que es una distinción importante que hacer y una que no se hace lo suficiente, probablemente por qué las compañías como Gitlab están prosperando porque entienden las necesidades de la empresa y la necesidad de controles.
code4cause
9

Forking crea un repositorio completamente nuevo a partir del repositorio existente (simplemente haciendo git clone en gitHub / bitbucket)

Las horquillas se usan mejor: cuando la intención de la 'división' es crear un proyecto lógicamente independiente, que nunca se reunirá con su padre.

La estrategia de sucursal crea una nueva sucursal sobre el repositorio existente / en funcionamiento

Las ramas se utilizan mejor: cuando se crean como lugares temporales para trabajar a través de una característica, con la intención de fusionar la rama con el origen.

Más específico: - En los proyectos de código abierto, es el propietario del repositorio quien decide quién puede empujar al repositorio. Sin embargo, la idea del código abierto es que todos puedan contribuir al proyecto.

Este problema se resuelve con tenedores: cada vez que un desarrollador quiere cambiar algo en un proyecto de código abierto, no clona directamente el repositorio oficial. En cambio, lo bifurcan para crear una copia. Cuando finaliza el trabajo, realizan una solicitud de extracción para que el propietario del repositorio pueda revisar los cambios y decidir si fusionarlos con su proyecto.

En esencia, la bifurcación es similar a la bifurcación de características, pero en lugar de crear ramas se crea una bifurcación del repositorio, y en lugar de hacer una solicitud de fusión, se crea una solicitud de extracción.

Los siguientes enlaces proporcionan la diferencia de una manera bien explicada:

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html

quién soy
fuente
Las declaraciones de "mejor uso" en esta respuesta parecen ignorar muchos de los problemas que impiden que la ramificación funcione para cosas como proyectos de código abierto, así como la realidad de cómo se utilizan los tenedores en el mundo real. Es extremadamente común ver los tenedores utilizados junto con las solicitudes de extracción para permitir que las personas colaboren en un proyecto que no todos tienen permisos para modificar un repositorio dado directamente.
StriplingWarrior