He comenzado a jugar con Git y he encontrado los términos "upstream" y "downstream". Los he visto antes pero nunca los entendí completamente. ¿Qué significan estos términos en el contexto de SCM ( herramientas de gestión de configuración de software ) y el código fuente?
902
Respuestas:
En términos de control de fuente, está " aguas abajo " cuando copia (clona, finaliza la compra, etc.) desde un repositorio. La información fluyó "aguas abajo" hacia usted.
Cuando realiza cambios, generalmente desea enviarlos de vuelta "en sentido ascendente " para que lleguen a ese repositorio de modo que todos los que extraen de la misma fuente estén trabajando con los mismos cambios. Esto es principalmente una cuestión social de cómo todos pueden coordinar su trabajo en lugar de un requisito técnico de control de fuente. Desea obtener sus cambios en el proyecto principal para no seguir líneas de desarrollo divergentes.
A veces leerá acerca de los administradores de paquetes o versiones (las personas, no la herramienta) hablando sobre cómo enviar cambios a "upstream". Eso generalmente significa que tuvieron que ajustar las fuentes originales para poder crear un paquete para su sistema. No quieren seguir haciendo esos cambios, por lo que si los envían "aguas arriba" a la fuente original, no deberían tener que lidiar con el mismo problema en la próxima versión.
fuente
-u
comogit push --set-upstream origin master
si no es un requisito técnico ? Podemospush -u origin
o nopush origin
, por lo que es un requisito tecnológico. Pero cual es la diferencia?Cuando lees en la
git tag
página man :, eso simplemente significa que no hay un repositorio absoluto ascendente o un repositorio descendente.
Esas nociones son siempre relativas entre dos repositorios y dependen de la forma en que fluyen los datos:
Si "yourRepo" ha declarado "otherRepo" como uno remoto, entonces :
Tenga en cuenta el "desde" y "para": usted no es sólo "aguas abajo", usted es "aguas abajo de / para ", de ahí el aspecto relativo.
El giro del DVCS (Sistema de control de versiones distribuido) es: no tiene idea de qué es realmente en sentido descendente, además de su propio repositorio en relación con los repositorios remotos que ha declarado.
Básicamente:
En términos de " flujo de datos ", su repositorio está en la parte inferior ("aguas abajo") de un flujo que proviene de repositorios ascendentes ("pull from") y regresa a (el mismo u otro) repositorios ascendentes ("push to" )
Puede ver una ilustración en la
git-rebase
página del manual con el párrafo "RECUPERANDO DE LA REEMBOLSO DE UPSTREAM":Significa que se está retirando de un repositorio "en sentido ascendente" donde se realizó un rebase , y usted (el repositorio "en sentido descendente" está atascado con la consecuencia (muchos commits duplicados, porque la rama rebaseada en sentido ascendente recreó los commits de la misma rama que usted) tener localmente).
Eso es malo porque para un repositorio "ascendente", puede haber muchos repositorios descendentes (es decir, repos que se extraen del repositorio ascendente, con la rama rebaseada), todos ellos potencialmente teniendo que lidiar con los commits duplicados.
Nuevamente, con la analogía del "flujo de datos", en un DVCS, un comando incorrecto "aguas arriba" puede tener un " efecto dominó " aguas abajo.
Nota: esto no se limita a los datos.
También se aplica a los parámetros , ya que los comandos git (como los de "porcelana") a menudo llaman internamente otros comandos git (los de "plomería"). Ver
rev-parse
página del manual :fuente
Seguimiento ascendente (en relación con)
El término upstream también tiene un significado inequívoco en el conjunto de herramientas GIT, especialmente en relación con el seguimiento
Por ejemplo :
origin
(su repositorio bifurcado en github) yupstream
(el repositorio en github que bifurcó). Esos son solo nombres intercambiables, solo la url 'git @ ...' los identifica.Digamos que desea establecer el origen / maestro de la sucursal remota para que sea la rama de seguimiento de la sucursal maestra local que ha extraído. Solo emite:
Upstream y Push (Gotcha)
echa un vistazo a la
git-config(1)
página del manualfuente
git branch --help
partir de 2018:As this option had confusing syntax, it is no longer supported. Please use --track or --set-upstream-to instead.
Eso es un poco de terminología informal.
En lo que respecta a Git, cualquier otro repositorio es solo un control remoto.
En términos generales, aguas arriba es donde clonaste (el origen). Downstream es cualquier proyecto que integre su trabajo con otros trabajos.
Los términos no están restringidos a los repositorios de Git.
Por ejemplo, Ubuntu es un derivado de Debian, por lo que Debian está en sentido ascendente para Ubuntu.
fuente
Aguas arriba llamado nocivo
Hay, por desgracia, otro uso de "aguas arriba" al que las otras respuestas aquí no están llegando, es decir, para referirse a la relación padre-hijo de los compromisos dentro de un repositorio. Scott Chacon en el libro Pro Git es particularmente propenso a esto, y los resultados son desafortunados. No imites esta forma de hablar.
Por ejemplo, dice de una fusión que resulta en un avance rápido de que esto sucede porque
Quiere decir que cometer B es el único hijo del único hijo de ... del único hijo de cometer A, por lo que para fusionar B en A es suficiente mover la referencia A para señalar el compromiso B. ¿Por qué esta dirección? debería llamarse "aguas arriba" en lugar de "aguas abajo", o por qué la geometría de un gráfico de línea recta tan pura debe describirse "directamente aguas arriba", es completamente confusa y probablemente arbitraria. (La página del manual para
git-merge
hace un trabajo mucho mejor al explicar esta relación cuando dice que "el jefe de la sucursal actual es un antepasado del commit nombrado". Ese es el tipo de cosas que Chacon debería haber dicho).De hecho, el propio Chacon parece usar "aguas abajo" más adelante para significar exactamente lo mismo, cuando habla de reescribir todas las confirmaciones secundarias de una confirmación eliminada:
Básicamente, parece no tener una idea clara de lo que quiere decir "aguas arriba" y "aguas abajo" cuando se refiere a la historia de los compromisos a lo largo del tiempo. Este uso es informal, entonces, y no debe fomentarse, ya que es confuso.
Está perfectamente claro que cada commit (excepto uno) tiene al menos un padre, y que los padres de los padres son antepasados; y en la otra dirección, los commits tienen hijos y descendientes. Esa es la terminología aceptada, y describe la direccionalidad del gráfico de manera inequívoca, por lo que esa es la forma de hablar cuando desea describir cómo se relacionan los commits entre sí dentro de la geometría del gráfico de un repositorio. No utilice "aguas arriba" o "aguas abajo" sin apretar en esta situación.
[Nota adicional: He estado pensando en la relación entre la primera oración de Chacon que cito arriba y la
git-merge
página del manual, y se me ocurre que la primera puede estar basada en un malentendido de la segunda. La página de manual continúa describiendo una situación en la que el uso de "upstream" es legítimo: el avance rápido a menudo ocurre cuando "está rastreando un repositorio de upstream, no ha cometido cambios locales y ahora desea actualizar a uno más nuevo revisión aguas arriba ". Entonces quizás Chacon usó "río arriba" porque lo vio aquí en la página del manual. Pero en la página del manual hay un repositorio remoto; no hay un repositorio remoto en el ejemplo citado de Chacon de avance rápido, solo un par de sucursales creadas localmente.]fuente
<branch>
.git-rebase
documentos porque estaba totalmente confundido por qué una referencia de confirmación se llamaría "ascendente" allí (de hecho, dudaba de mí mismo ya que no había visto esta terminología antes). ¡Gracias @outis y @matt por aclarar las cosas!En general;
Esto se aplica a todos los sistemas en forma de árbol, incluidos los sistemas de control de origen.
fuente