¿Los tenedores Git son en realidad clones Git?

817

Sigo escuchando a la gente decir que están bifurcando código en Git. El "tenedor" de Git suena sospechosamente como el "clon" de Git más alguna disposición psicológica (sin sentido) para renunciar a futuras fusiones. No hay un comando fork en Git, ¿verdad?

GitHub hace que los tenedores sean un poco más reales al grapar la correspondencia en él. Es decir, presiona el botón de la horquilla y luego, cuando presiona el botón de solicitud de extracción, el sistema es lo suficientemente inteligente como para enviar un correo electrónico al propietario. Por lo tanto, es un poco un baile en torno a la propiedad y los permisos del repositorio.

¿Sí No? ¿Alguna angustia por GitHub extendiendo Git en esta dirección? ¿O hay rumores de que Git absorbe la funcionalidad?

Brian
fuente
10
Sí, es solo un tipo de clon que es rastreado por la base de datos github.
Paŭlo Ebermann
15
¿No hace GitHub algo especial para evitar duplicar los requisitos de almacenamiento (en los propios servidores de GitHub)?
Keith Thompson,
18
Todavía no se menciona: al eliminar un repositorio privado, se eliminan todos sus tenedores. Eliminar un repositorio público mantiene los tenedores, pero promueve que un tenedor sea el nuevo repositorio principal. Si su jefe hace que su repositorio público sea privado, rompe todos los tenedores existentes y no podrá realizar solicitudes de extracción de ellos al repositorio privado. help.github.com/articles/…
Platón
Creo (sin pruebas, ya que GitHub no nos muestra esto) que el mecanismo real aquí son las "alternativas" de Git. En otras palabras, el tenedor es un clon espejo con --referenceusado. No está claro exactamente cómo se manejan los repositorios públicos y las eliminaciones (mover alternativas al repositorio promocionado elegido al azar? Señalar todos los tenedores a alguna alternativa común que no sea parte de la bifurcación original?), Pero el uso de alternativas explica varios comportamientos observables.
torek

Respuestas:

925

Fork , en el contexto de GitHub, no extiende Git.
Solo permite clonar en el lado del servidor.

Cuando clona un repositorio de GitHub en su estación de trabajo local, no puede contribuir de nuevo al repositorio ascendente a menos que sea declarado explícitamente como "colaborador". Eso es porque su clon es una instancia separada de ese proyecto. Si desea contribuir al proyecto, puede usar la bifurcación para hacerlo, de la siguiente manera:

  • clonar ese repositorio de GitHub en su cuenta de GitHub (esa es la parte "fork" , un clon en el lado del servidor)
  • contribuir se compromete con ese repositorio de GitHub (está en su propia cuenta de GitHub, por lo que tiene todo el derecho de ingresar)
  • señalizar cualquier contribución interesante al repositorio original de GitHub (esa es la parte de "solicitud de extracción" a través de los cambios que realizó en su propio repositorio de GitHub)

Consulte también " Flujo de trabajo colaborativo de GitHub ".

Si desea mantener un enlace con el repositorio original (también llamado ascendente), debe agregar un control remoto que haga referencia a ese repositorio original.
Consulte " ¿Cuál es la diferencia entre origen y upstream en GitHub? "

tenedor y aguas arriba

Y con Git 2.20 (Q4 2018) y más, la búsqueda desde fork es más eficiente, con islas delta .

VonC
fuente
66
"Cuando clona un repositorio de GitHub en su estación de trabajo local, no puede contribuir de nuevo al repositorio ascendente a menos que se lo declare explícitamente como" contribuidor ". --- ¿No es esto cierto con "bifurcación"? Por favor explique.
chharvey
61
@ TestSubject528491 no, con una bifurcación, eso significa que está clonando el repositorio ascendente como su propio repositorio en el lado del servidor GitHub. Luego, puede clonar localmente ese nuevo repositorio "fork" en su computadora y empujarlo libremente, ya que usted es el creador y propietario de ese fork.
VonC
99
Para mí, el punto clave es que no puede enviar un RP desde su copia local a menos que sea declarado contribuyente . Estoy tan acostumbrado a enviar relaciones públicas desde mi repositorio local, pero eso es porque siempre estoy marcado como colaborador. Si lo piensa, para enviar un RP debe empujar una rama al repositorio remoto y luego crear el RP. Supongo que tiene sentido si no quieres que personas al azar creen ramas en tu repositorio. Y que preferiría que lo bifurcaran y enviaran RP de esa manera.
Adam Zerner
He visto el segundo enfoque remoto "aguas arriba" en otra parte, pero ¿no es más sencillo pasar directamente de "GitHub - Original" a "GitHub - Fork"? El segundo enfoque remoto no parecía funcionar en mi configuración de Eclipse y eGit, al no poder presionar mi repositorio "GitHub - Fork" (nada que presionar).
William T. Mallard
No importa, el enlace de información aquí me dio una idea. Como colaborador, tiene sentido pasar de "GitHub - Original" a "GitHub - Fork", luego de "- Fork" a la máquina local, pero si usted es el propietario, probablemente quiera sacarlo directamente de mi "- Fork" primero para revisar, ejecutar pruebas, etc. antes de presionar "- Original".
William T. Mallard
135

Sigo escuchando a personas decir que están bifurcando código en git. Git "fork" suena sospechosamente como git "clon" más alguna disposición psicológica (sin sentido) para renunciar a futuras fusiones. No hay un comando fork en git, ¿verdad?

"Forking" es un concepto, no un comando específicamente compatible con cualquier sistema de control de versiones.

La bifurcación más simple es sinónimo de ramificación. Cada vez que crea una rama, independientemente de su VCS, se "bifurca". Estas horquillas suelen ser bastante fáciles de fusionar.

El tipo de bifurcación del que estás hablando, donde una parte separada toma una copia completa del código y se va, necesariamente ocurre fuera del VCS en un sistema centralizado como Subversion. Un VCS distribuido como Git tiene un soporte mucho mejor para bifurcar toda la base de código y comenzar efectivamente un nuevo proyecto.

Git (no GitHub) admite de forma nativa "bifurcar" un repositorio completo (es decir, clonarlo) de dos maneras:

  • cuando clonas, originse crea una llamada remota para ti
  • de manera predeterminada, todas las ramas en el clon rastrearán sus originequivalentes
  • buscar y fusionar cambios del proyecto original del que se bifurcó es trivialmente fácil

Git hace que los cambios de contribución a la fuente de la bifurcación sean tan simples como pedirle a alguien del proyecto original que se retire de ti o solicitar acceso de escritura para impulsar los cambios tú mismo. Esta es la parte que GitHub facilita y estandariza.

¿Alguna angustia sobre Github extendiendo git en esta dirección? ¿O hay rumores de que git absorbe la funcionalidad?

No hay angustia porque su suposición es incorrecta. GitHub "extiende" la funcionalidad de bifurcación de Git con una buena GUI y una forma estandarizada de emitir solicitudes de extracción, pero no agrega la funcionalidad a Git. El concepto de bifurcación de repositorio completo se integra directamente en el control de versión distribuido a un nivel fundamental. Podrías abandonar GitHub en cualquier momento y seguir empujando / tirando proyectos que has "bifurcado".

meagar
fuente
66
Gracias por tu excelente respuesta. Solo quiero aclarar, esto significa que, fuera del contexto de github , podría clonar algunos X projecten mi máquina. Si hago cambios en mi local y no tengo acceso de escritura al origen, le enviaré un correo electrónico al autor del proyecto para solicitar una extracción. Hará un control remoto llamado gideon que será una url para mi clon local, y puede tirar, ¿verdad?
Gideon
1
Si desea contribuir con sus cambios a un proyecto, puede guardarlos en archivos, por ejemplo, usando el parche de formato git y adjuntarlos a un correo electrónico a alguien que tenga acceso de escritura, o puede obtener su propio alojamiento, empuje su trabajo a eso y envíe la URL en un correo electrónico, por ejemplo, utilizando el comando git request-pull. Los repositorios en estaciones de trabajo generalmente no son accesibles en línea.
bdsl
Pero sí, si su estación de trabajo resulta accesible a través de Internet para el autor del proyecto, simplemente puede enviarles la URL y ellos pueden agregarla como control remoto y extraerla.
bdsl
1
Re: angustia, lo único para mí es que no hay un enlace o botón para hacer clic para crear un botón de perspectiva de extracción desde mi repo donde GitHub te dice que tienes 50 compromisos detrás. No es gran cosa ahora que sé que están usando el término "Solicitud de extracción" para incluir también las solicitudes de extracción desde la parte superior a su bifurcación GitHub. Git es duro.
William T. Mallard
80

Sí, el tenedor es un clon. Surgió porque no se puede enviar copias de otros sin su permiso . Te hacen una copia ( tenedor ), donde también tendrás permiso de escritura.

En el futuro, si el propietario real u otros usuarios con una bifurcación como sus cambios pueden devolverlo a su propio repositorio. Alternativamente, puede enviarles una "solicitud de extracción".

ssapkota
fuente
¿Puedo simplemente clonar el repositorio en mi máquina local, crear una rama y luego enviar una solicitud de extracción al propietario original? Parece redundante tener múltiples copias de repos en todo GitHub, solo para facilitar las actualizaciones de código.
Casey
44
@Casey Solo puede enviar una solicitud de extracción a través de GitHub desde GitHub y solo puede enviar una solicitud de extracción de GitHub desde una sucursal que exista en GitHub. Si no es un colaborador en el Repositorio en cuestión, no hay forma de crear una rama desde la que pueda iniciar una solicitud de extracción de GitHub. Nada le impide hacerlo por correo electrónico a la antigua usanza, pero GitHub no juega ningún papel en eso.
Beau Simensen
2
@Casey, una razón es que normalmente otros no tienen acceso URL a su estación de trabajo. GitHub forksignifica que hay una copia de su trabajo en el servidor de GitHub, a la que puede pushacceder y a la que otros tienen acceso a URL para que puedan hacerlo pull. Esta pull requestes solo una forma estándar de obtener la URL de su copia (en GitHub) para que puedan acceder fácilmente a su repositorio.
Jesse Chisholm
Esta debería ser la respuesta correcta / aceptada, creo. Imagine un desastre en una escena en la que un equipo de 15-20 desarrolladores crean ramas y empujan hacia el origen frente a 15-20 desarrolladores que tienen su propia copia del mismo repositorio y hacen tantas ramas, realizan cambios y retroceden. Luego, el autor del repositorio original solo puede obtener los cambios que desee.
Kishor Pawar
37

"Bifurcación" en este contexto significa "Hacer una copia de su código para que pueda agregar mis propias modificaciones". No hay mucho más que decir. Cada clon es esencialmente una bifurcación, y depende del original decidir si sacar los cambios de la bifurcación.

Daenyth
fuente
2
En específico: "Haga una copia de su código on the GitHub serverpara que pueda agregar mis propias modificaciones and others can have URL access to my version". La mayoría de las estaciones de trabajo locales no ofrecen acceso a URL para que nadie pueda acceder. Pero si empuja a su bifurcación en el servidor, entonces pueden tener la URL para la extracción.
Jesse Chisholm
La pregunta no es sobre la bifurcación en general, sino sobre la bifurcación de GitHub específicamente.
reinierpost
26

La clonación implica hacer una copia del repositorio git en una máquina local, mientras que la bifurcación es clonar el repositorio en otro repositorio. La clonación es solo para uso personal (aunque pueden ocurrir fusiones futuras), pero con la bifurcación está copiando y abriendo una nueva ruta de proyecto posible

Sam Johnson
fuente
11

La bifurcación se realiza cuando decides contribuir a algún proyecto. Haría una copia de todo el proyecto junto con sus registros de historial. Esta copia se realiza completamente en su repositorio y una vez que realiza estos cambios, emite una solicitud de extracción. Ahora le corresponde al propietario de la fuente aceptar su solicitud de extracción e incorporar los cambios en el código original.

Git clone es un comando real que permite a los usuarios obtener una copia de la fuente. git clone [URL] Esto debería crear una copia de [URL] en su propio repositorio local.

aliasav
fuente
10

Creo que fork es una copia de otro repositorio pero con la modificación de su cuenta. por ejemplo, si clona directamente otro repositorio localmente, el origen del objeto remoto sigue utilizando la cuenta desde la que clona. No puede comprometerse y contribuir con su código. Es solo una copia pura de los códigos. De lo contrario, si bifurca un repositorio, clonará el repositorio con la actualización de la configuración de su cuenta en su cuenta de github. Y luego clonando el repositorio en el contexto de su cuenta, puede confirmar sus códigos.

Daniel Shen
fuente
10

Aquí hay un malentendido con respecto a lo que es un "tenedor". Una bifurcación no es más que un conjunto de ramas por usuario. Cuando empuja a una bifurcación, realmente empuja al repositorio original, porque ese es el ÚNICO repositorio.

Puede probar esto empujando a una bifurcación, observando el commit y luego yendo al repositorio original y usando la ID de commit, verá que el commit está "en" el repositorio original.

Esto tiene mucho sentido, pero está lejos de ser obvio (solo descubrí esto accidentalmente recientemente).

Cuando John bifurca el repositorio SuperProject, lo que parece suceder realmente es que todas las ramas en el repositorio de origen se replican con un nombre como "John.master", "John.new_gui_project", etc.

GitHub "esconde" al "John". de nosotros y nos da la ilusión de que tenemos nuestra propia "copia" del repositorio en GitHub, pero no lo necesitamos y ni siquiera es necesario.

Así que la rama de mi tenedor "maestro" en realidad se llama "Korporal.master", pero la interfaz de usuario de GitHub nunca revela esto, mostrándome solo "maestro".

Esto es más o menos lo que creo que sucede debajo del capó de todos modos en función de las cosas que he estado haciendo recientemente y cuando lo reflexionas, es un muy buen diseño.

Por esta razón, creo que sería muy fácil para Microsoft implementar las bifurcaciones Git en su oferta de Visual Studio Team Services.

Hugh
fuente
Estimado Hugh, la mitad de su respuesta es realmente incorrecta: una bifurcación es un clon de un repositorio completo de una cuenta de usuario a otra, junto con todas las ramas e historial. Cuando se compromete con la bifurcación, nada cambia en el repositorio original desde el que se bifurcó. Pero además de estos pocos malentendidos de su parte con respecto a lo que es una "bifurcación", ahora hay algunas buenas noticias: los servicios de Visual Studio Team incluyen ahora una funcionalidad "Bifurcación". ;)
Sorin Postelnicu
1
@SorinPostelnicu fuente? Me inclino a creerle a Hugh aquí debido a la experiencia personal de los tenedores que se comportan de manera inconstante con ellos como un simple clon del repositorio. Por ejemplo, cuando se elimina el flujo ascendente, se eliminan los tenedores (como se mencionó en un comentario sobre la pregunta de OP) y, a veces, el flujo ascendente termina fusionando cosas en las ramas de mis tenedores al aceptar una solicitud de extracción, sin que yo haga nada.
papa
De hecho, este parece ser el caso. Después de todo, sería increíblemente estúpido para GitHub, literalmente, git cloneun repositorio completamente nuevo (incluso uno "desnudo") cada vez que alguien presiona el botón "tenedor", sería un desperdicio increíble de almacenamiento y probablemente también un vector de ataque. .
Greg A. Woods el
7

Además del hecho de que la clonación es del servidor a su máquina y la bifurcación está haciendo una copia en el servidor mismo, una diferencia importante es que cuando clonamos, en realidad obtenemos todas las ramas, etiquetas, etc.

Pero cuando nos bifurcamos, en realidad solo obtenemos los archivos actuales en la rama maestra, nada más que eso. Esto significa que no obtenemos las otras ramas, etc.

Por lo tanto, si tiene que fusionar algo con el repositorio original, es una fusión entre repositorios y definitivamente necesitará mayores privilegios.

Fork no es un comando en Git; es solo un concepto que implementa GitHub. Recuerde que Git fue diseñado para trabajar en un entorno de igual a igual sin la necesidad de sincronizar cosas con ninguna copia maestra. El servidor es solo otro par, pero lo vemos como una copia maestra.

Deepak GM
fuente
77
¿Eh? Un tenedor obtiene todas las ramas, aunque debe saber dónde buscar (pista:) git branch -a.
tripleee
3

En términos más simples,

Cuando dice que está bifurcando un repositorio, básicamente está creando una copia del repositorio original con su ID de GitHub en su cuenta de GitHub.

y

Cuando dice que está clonando un repositorio, está creando una copia local del repositorio original en su sistema (PC / laptop) directamente sin tener una copia en su cuenta de GitHub.

anoNewb
fuente