Eu sempre ouço pessoas dizendo que é melhor "mesclar a montante" e coisas assim quando se trata de projetar software e coisas do gênero. Eu tenho a sensação de que isso tem a ver com as coisas principais do kernel Linux, mas provavelmente estou errado.
E também, o que é o oposto de "upstream". Se não é bom ir "a montante", qual é a alternativa e por quê?
fonte
Usando o Ubuntu como um exemplo.
O Ubuntu é uma distribuição que reúne muitos softwares, pequenos e grandes. Existem drivers gráficos, o servidor X e o Gnome, entre outros. O próprio Ubuntu não está desenvolvendo esses softwares. O Ubuntu está "apenas" reunindo o software, garantindo que os componentes individuais funcionem juntos. Todo esse software que o Ubuntu está reunindo é chamado upstream do ponto de vista do Ubuntu.
No processo de combinar todo esse software, erros podem aparecer. O bug pode estar em um dos componentes do software, por exemplo, gnome, ou pode ser da maneira mais especial que o Ubuntu está fazendo. Afinal, uma distribuição é uma distribuição porque faz algumas coisas de uma maneira muito especial.
Se o bug for causado pela maneira como o Ubuntu está fazendo as coisas, o Ubuntu precisará corrigi-lo. Se o bug estiver de fato em um dos componentes do software, por exemplo, o Gnome, o Ubuntu precisará corrigir o Gnome. Quando o Ubuntu envia o patch de volta ao Gnome, para que outros também possam se beneficiar do patch, o Ubuntu está enviando esse patch a montante .
Se o Ubuntu decidir não enviar esse patch a montante, ou o projeto upstream rejeitar o patch (mas o ubuntu decidir continuar com o patch), o Ubuntu tecnicamente bifurcou o projeto.
O oposto de upstream seria downstream, o Ubuntu está downstream do Gnome. Não ouço / leio esse termo usado com frequência.
Veja também o artigo sobre upstream na Wikipedia.
fonte