Definition von "Downstream" und "Upstream"

902

Ich habe angefangen mit Git zu spielen und bin auf die Begriffe "Upstream" und "Downstream" gestoßen. Ich habe diese schon einmal gesehen, aber nie vollständig verstanden. Was bedeuten diese Begriffe im Zusammenhang mit SCMs ( Software Configuration Management Tools) und Quellcode?

brendan
quelle
13
Es gibt zwei verschiedene Kontexte für Upstream / Downstream in Git: Fernbedienungen und Zeit / Geschichte. Upstream / Downstream in Bezug auf Fernbedienungen ist, dass das Downstream-Repo aus dem Upstream-Repo gezogen wird (Änderungen fließen natürlich Downstream). Upstream / Downstream in Bezug auf Zeit / Geschichte kann verwirrend sein, da Upstream in der Zeit Downstream in der Geschichte bedeutet und umgekehrt (Genealogie-Terminologie funktioniert hier viel besser - Eltern / Vorfahren / Kind / Nachkommen).
Charlesreid1
6
Verwandte: Was bedeutet "Upstream"? bei OS
Kenorb
5
Verwandte: Unterschied zwischen Ursprung und Upstream auf gitHub
RBT

Antworten:

703

In Bezug auf die Quellcodeverwaltung sind Sie " nachgelagert ", wenn Sie aus einem Repository kopieren (klonen, auschecken usw.). Informationen flossen "stromabwärts" zu Ihnen.

Wenn Sie Änderungen vornehmen, möchten Sie diese normalerweise " stromaufwärts " zurücksenden, damit sie in dieses Repository gelangen, sodass jeder, der aus derselben Quelle zieht, mit denselben Änderungen arbeitet. Dies ist hauptsächlich eine soziale Frage, wie jeder seine Arbeit koordinieren kann, und keine technische Anforderung der Quellcodeverwaltung. Sie möchten Ihre Änderungen in das Hauptprojekt übernehmen, damit Sie keine unterschiedlichen Entwicklungslinien verfolgen.

Manchmal lesen Sie über Paket- oder Release-Manager (die Personen, nicht das Tool), die über das Übermitteln von Änderungen an "Upstream" sprechen. Das bedeutet normalerweise, dass sie die Originalquellen anpassen mussten, um ein Paket für ihr System zu erstellen. Sie möchten diese Änderungen nicht weiter vornehmen. Wenn sie sie also "Upstream" an die ursprüngliche Quelle senden, sollten sie sich in der nächsten Version nicht mit demselben Problem befassen müssen.

brian d foy
quelle
116
"Download" und "Upload" sind Verben. "Upstream" und "Downstream" beschreiben eine relative Position.
Brian D Foy
2
Ich würde sagen, Upstream und Downstream sind Adjektive
Crt
8
Sie sind Adjektive, wenn sie als Modifikatoren verwendet werden, aber diese Begriffe werden oft als Substantive verwendet.
Brian D Foy
2
@ MycrofD Wörter können je nach Kontext als Adjektive und Substantive verwendet werden
reggaeguitar
1
Dies ist meist eher ein soziales Problem als eine technische Anforderung . Warum gibt es eine Option , -uwie git push --set-upstream origin masterwenn es nicht eine technische Anforderung ? Wir können push -u originoder ohne push origin, also ist es eine technische Anforderung. Aber was ist der Unterschied?
Grün
249

Wenn Sie in der git tagManpage lesen :

Ein wichtiger Aspekt von Git ist, dass es verteilt ist. Wenn es weitgehend verteilt ist, bedeutet dies, dass das System kein inhärentes "Upstream" oder "Downstream" enthält.

Das bedeutet einfach, dass es kein absolutes Upstream-Repo oder Downstream-Repo gibt.
Diese Begriffe sind immer relativ zwischen zwei Repos und hängen von der Art und Weise ab, wie Daten fließen:

Wenn "yourRepo" "otherRepo" als Remote deklariert hat, dann :

  • Sie ziehen vom Upstream "otherRepo" ("otherRepo" ist "Upstream von Ihnen" und Sie sind "Downstream für otherRepo").
  • Sie drücken auf Upstream ("otherRepo" ist immer noch "Upstream", wo die Informationen jetzt zurückgehen).

Beachten Sie das "von" und "für": Sie sind nicht nur "stromabwärts", Sie sind "stromabwärts von / für ", daher der relative Aspekt.


Die Wendung des DVCS (Distributed Version Control System) lautet: Sie haben keine Ahnung, was Downstream tatsächlich ist, abgesehen von Ihrem eigenen Repo im Verhältnis zu den von Ihnen deklarierten Remote-Repos.

  • Sie wissen, was Upstream ist (die Repos, aus denen Sie ziehen oder zu denen Sie drücken)
  • Sie wissen nicht, woraus Downstream besteht (die anderen Repos ziehen aus Ihrem Repo oder drücken auf dieses ).

Grundsätzlich:

In Bezug auf " Datenfluss " befindet sich Ihr Repo am unteren Ende ("Downstream") eines Flusses, der von Upstream-Repos ("Pull from") kommt und zu (denselben oder anderen) Upstream-Repos ("Push to") zurückkehrt. ).


Sie können eine Abbildung in der git-rebaseManpage mit dem Absatz "RECOVERING FROM UPSTREAM REBASE" sehen:

Dies bedeutet, dass Sie aus einem "Upstream" -Repo ziehen, in dem eine Rebase stattgefunden hat , und dass Sie (das "Downstream" -Repo) mit der Konsequenz stecken bleiben (viele doppelte Commits, da der vorgelagerte Zweig die Commits desselben Zweigs neu erstellt hat, den Sie neu erstellt haben vor Ort haben).

Das ist schlecht, weil es für ein "Upstream" -Repo viele Downstream-Repos geben kann (dh Repos, die aus dem Upstream-Repos mit dem neu basierten Zweig gezogen werden), die sich alle möglicherweise mit den doppelten Commits befassen müssen.

Wiederum kann mit der Analogie "Datenfluss" in einem DVCS ein fehlerhafter Befehl "Upstream" einen " Ripple-Effekt " Downstream haben.


Hinweis: Dies ist nicht auf Daten beschränkt.
Dies gilt auch für Parameter , da Git-Befehle (wie die "Porzellan" -Befehle) häufig intern andere Git-Befehle (die "Sanitär" -Befehle) aufrufen. Siehe rev-parseManpage :

Viele git porcelainish-Befehle verwenden eine Mischung aus Flags (dh Parametern, die mit einem Bindestrich ' -' beginnen) und Parametern, die für den zugrunde liegenden git rev-listBefehl bestimmt sind, den sie intern verwenden, sowie Flags und Parametern für die anderen Befehle, die sie nachgeschaltet verwendengit rev-list . Dieser Befehl wird verwendet, um zwischen ihnen zu unterscheiden.

VonC
quelle
15
Sie ziehen von stromaufwärts und Sie schieben von stromaufwärts. Pushing to Downstream klingt für mich sehr falsch
Knittl
1
@knittl: du hast recht. Ich habe meine Antwort umformuliert, um die Rolle des "Upstream" -Repos im Verhältnis zu Ihrem eigenen lokalen (und "Downstream") Repo besser zu veranschaulichen.
VonC
85

Upstream (im Zusammenhang mit) Tracking

Der Begriff Upstream hat auch eine eindeutige Bedeutung für die Suite der GIT-Tools, insbesondere in Bezug auf das Tracking

Beispielsweise :

   $git rev-list --count --left-right "@{upstream}"...HEAD
   >4   12

Gibt (den letzten zwischengespeicherten Wert von) die Anzahl der Commits hinter (links) und vor (rechts) Ihres aktuellen Arbeitszweigs aus, bezogen auf den ( falls vorhanden ) aktuell verfolgten Remote-Zweig für diesen lokalen Zweig. Andernfalls wird eine Fehlermeldung ausgegeben:

    >error: No upstream branch found for ''
  • Wie bereits gesagt, haben Sie möglicherweise eine beliebige Anzahl von Fernbedienungen für ein lokales Repository. Wenn Sie beispielsweise ein Repository von github abspalten und dann eine Pull-Anforderung ausgeben, haben Sie mit Sicherheit mindestens zwei: origin(Ihr gegabeltes Repo ist aktiviert Github) und upstream(das Repo auf Github, aus dem Sie gegabelt haben). Dies sind nur austauschbare Namen, nur die URL 'git @ ...' identifiziert sie.

Sie .git/configlesen:

   [remote "origin"]
       fetch = +refs/heads/*:refs/remotes/origin/*
       url = [email protected]:myusername/reponame.git
   [remote "upstream"]
       fetch = +refs/heads/*:refs/remotes/upstream/*
       url = [email protected]:authorname/reponame.git
  • Andererseits ist die Bedeutung von @ {upstream} für GIT eindeutig:

Es ist "der Zweig" (falls vorhanden) auf "der Fernbedienung" , der den "aktuellen Zweig" in Ihrem "lokalen Repository" verfolgt .

Es ist der Zweig, aus dem Sie abrufen / ziehen, wenn Sie ein einfaches git fetch/ git pullohne Argumente ausgeben .

Angenommen, Sie möchten den Ursprung / Master des Remote-Zweigs als Tracking-Zweig für den lokalen Master-Zweig festlegen, den Sie ausgecheckt haben. Einfach ausgeben:

   $ git branch --set-upstream  master origin/master
   > Branch master set up to track remote branch master from origin.

Dies fügt 2 Parameter hinzu in .git/config:

   [branch "master"]
       remote = origin
       merge = refs/heads/master

Versuchen Sie es jetzt (vorausgesetzt, die 'Upstream'-Fernbedienung hat einen' Dev'-Zweig).

   $ git branch --set-upstream  master upstream/dev
   > Branch master set up to track remote branch dev from upstream.

.git/config lautet jetzt:

   [branch "master"]
       remote = upstream
       merge = refs/heads/dev

git-push(1)Handbuchseite :

   -u
   --set-upstream

Fügen Sie für jeden Zweig, der aktuell ist oder erfolgreich gepusht wurde, eine Upstream- Referenz (Tracking- Referenz) hinzu, die von git-pull (1) ohne Argumente und anderen Befehlen verwendet wird. Weitere Informationen finden Sie branch.<name>.mergein git-config (1).

git-config(1)Handbuchseite :

   branch.<name>.merge

Definiert zusammen mit branch.<name>.remotedem Upstream- Zweig für den angegebenen Zweig. Es teilt git fetch / git pull / git rebase mit, welcher Zweig zusammengeführt werden soll, und kann sich auch auf git push auswirken (siehe push.default). \ (...)

   branch.<name>.remote

In Zweig <Name> teilt es git fetch und git push mit, von welcher Fernbedienung / Push zu holen ist. Der Standardwert ist origin, wenn keine Fernbedienung konfiguriert ist. origin wird auch verwendet, wenn Sie sich in keinem Zweig befinden.

Upstream und Push (Gotcha)

Schauen Sie sich die git-config(1)Handbuchseite an

   git config --global push.default upstream
   git config --global push.default tracking  (deprecated)

Dies soll verhindern, dass versehentlich auf Zweige gedrückt wird, die Sie noch nicht drücken können.

Peter Host
quelle
4
Auszug von git branch --helpab 2018:As this option had confusing syntax, it is no longer supported. Please use --track or --set-upstream-to instead.
Zezollo
59

Das ist ein bisschen informelle Terminologie.

Für Git ist jedes andere Repository nur eine Fernbedienung.

Im Allgemeinen ist Upstream der Ort, von dem aus Sie geklont haben (der Ursprung). Downstream ist jedes Projekt, das Ihre Arbeit mit anderen Arbeiten integriert.

Die Bedingungen sind nicht auf Git-Repositorys beschränkt.

Zum Beispiel ist Ubuntu ein Debian-Derivat, also ist Debian für Ubuntu vorgelagert.

hasen
quelle
51

Upstream als schädlich bezeichnet

Leider gibt es eine andere Verwendung von "Upstream", auf die sich die anderen Antworten hier nicht beziehen, nämlich die Eltern-Kind-Beziehung von Commits innerhalb eines Repos. Scott Chacon im Pro Git-Buch ist dafür besonders anfällig, und die Ergebnisse sind unglücklich. Imitieren Sie diese Art zu sprechen nicht.

Zum Beispiel sagt er von einer Zusammenführung, die zu einem schnellen Vorlauf führt, dass dies geschieht, weil

Das Commit, auf das der Zweig zeigt, in dem Sie zusammengeführt haben, war direkt vor dem Commit, auf dem Sie sich befinden

Er möchte sagen, dass Commit B das einzige Kind des einzigen Kindes von ... des einzigen Kindes von Commit A ist. Um B mit A zusammenzuführen, reicht es aus, den Verweis A zu bewegen, um auf Commit B zu zeigen. Warum diese Richtung sollte eher als "stromaufwärts" als als "stromabwärts" bezeichnet werden, oder warum die Geometrie eines solchen reinen geraden Graphen "direkt stromaufwärts" beschrieben werden sollte, ist völlig unklar und wahrscheinlich willkürlich. (Die Manpage für git-mergeerklärt diese Beziehung viel besser, wenn sie besagt, dass "der aktuelle Zweigkopf ein Vorfahr des genannten Commits ist". So etwas hätte Chacon sagen sollen.)

Tatsächlich scheint Chacon selbst später "Downstream" zu verwenden, um genau dasselbe zu bedeuten, wenn er davon spricht, alle untergeordneten Commits eines gelöschten Commits neu zu schreiben:

Sie müssen alle Commits nach 6df76 neu schreiben, um diese Datei vollständig aus Ihrem Git-Verlauf zu entfernen

Grundsätzlich scheint er keine klare Vorstellung davon zu haben, was er unter "Upstream" und "Downstream" versteht, wenn er sich auf die Geschichte der Commits im Laufe der Zeit bezieht. Diese Verwendung ist also informell und nicht zu fördern, da sie nur verwirrend ist.

Es ist völlig klar, dass jedes Commit (außer einem) mindestens einen Elternteil hat und dass Eltern von Eltern somit Vorfahren sind; und in der anderen Richtung haben Commits Kinder und Nachkommen. Dies ist eine akzeptierte Terminologie und beschreibt die Richtwirkung des Diagramms eindeutig. Auf diese Weise können Sie sprechen, wenn Sie beschreiben möchten, wie Commits innerhalb der Diagrammgeometrie eines Repos miteinander in Beziehung stehen. Verwenden Sie "Upstream" oder "Downstream" in dieser Situation nicht lose.

[Zusätzlicher Hinweis: Ich habe über die Beziehung zwischen dem ersten Chacon-Satz, den ich oben zitiere, und der git-mergeManpage nachgedacht , und mir fällt ein, dass der erstere möglicherweise auf einem Missverständnis des letzteren beruht. In der Manpage wird eine Situation beschrieben, in der die Verwendung von "Upstream" legitim ist: Ein schneller Vorlauf erfolgt häufig, wenn "Sie ein Upstream-Repository verfolgen, keine lokalen Änderungen vorgenommen haben und jetzt auf ein neueres aktualisieren möchten vorgelagerte Revision. " Vielleicht hat Chacon "Upstream" verwendet, weil er es hier auf der Manpage gesehen hat. In der Manpage befindet sich jedoch ein Remote-Repository. In Chacons zitiertem Beispiel für den schnellen Vorlauf gibt es kein Remote-Repository, nur ein paar lokal erstellte Zweige.]

matt
quelle
14
Die git-rebase-Manpage leidet ebenfalls unter dieser Überlastung: Das Commit, das vor dem Rebasing ausgecheckt wird, wird als "Upstream" bezeichnet. Auch dies könnte sich auf die Verwendung von Chacon ausgewirkt haben.
Outis
@outis seltsam - In der git-HTML-Dokumentation wird der Zweig, der vor dem erneuten Basieren ausgecheckt wurde, als bezeichnet <branch>.
Jesper Matthiesen
Guter Punkt. Wäre irgendwie hilfreich, um irgendwo eine gemeinsame "Git-Terminologie" zu sammeln. Besonders für Neulinge (oder Leute, die zu Git beitragen). Hätte mir viel Zeit gespart, mich an den Wortlaut der Git-Manpages zu gewöhnen.
SebNag
@SebNag so etwas? linuxacademy.com/blog/linux/git-terms-explained
reggaeguitar
1
Kam aus den git-rebaseDokumenten hierher, weil ich völlig verwirrt war, warum ein Commit-Ref dort als "Upstream" bezeichnet wird (tatsächlich habe ich an mir selbst gezweifelt, da ich diese Terminologie noch nie gesehen habe). Vielen Dank an @outis & @matt für die Aufklärung!
Borek Bernard
0

Allgemein;

  • stromaufwärts ist in Richtung der Quelle
  • stromabwärts ist in Richtung der Spüle oder Ziel

Dies gilt für alle baumartigen Systeme, einschließlich Versionsverwaltungssysteme.

Stefan
quelle