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?
902
Antworten:
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.
quelle
-u
wiegit push --set-upstream origin master
wenn es nicht eine technische Anforderung ? Wir könnenpush -u origin
oder ohnepush origin
, also ist es eine technische Anforderung. Aber was ist der Unterschied?Wenn Sie in der
git tag
Manpage lesen :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 :
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.
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-rebase
Manpage 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-parse
Manpage :quelle
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 :
origin
(Ihr gegabeltes Repo ist aktiviert Github) undupstream
(das Repo auf Github, aus dem Sie gegabelt haben). Dies sind nur austauschbare Namen, nur die URL 'git @ ...' identifiziert sie.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:
Upstream und Push (Gotcha)
Schauen Sie sich die
git-config(1)
Handbuchseite anquelle
git branch --help
ab 2018:As this option had confusing syntax, it is no longer supported. Please use --track or --set-upstream-to instead.
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.
quelle
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
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-merge
erklä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:
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-merge
Manpage 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.]quelle
<branch>
.git-rebase
Dokumenten 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!Allgemein;
Dies gilt für alle baumartigen Systeme, einschließlich Versionsverwaltungssysteme.
quelle