「下流」と「上流」の定義


902

私はGitを使い始めて、「上流」と「下流」という用語に出会いました。私はこれらを以前に見たことがありますが、完全には理解していません。これらの用語は、SCM(ソフトウェア構成管理ツール)およびソースコードのコンテキストで何を意味しますか?


13
gitの上流/下流には、リモートと時間/履歴の2つの異なるコンテキストがあります。リモートに関して上流/下流は、下流レポが上流レポから引っ張られます(変更は自然に下流に流れます)。時間の上流/下流は歴史の混乱を招く可能性があります。時間の上流は歴史の下流を意味し、逆も同様です(系図の用語は、ここでは親/祖先/子/子孫の方がはるかにうまく機能します)。
charlesreid1 2015


5
関連:gitHubでの起点とアップストリームの違い
RBT

回答:


703

ソース管理に関しては、リポジトリからコピー(クローン、チェックアウトなど)するときは「ダウンストリーム」です。情報は「下流」に流れました。

変更を加える場合、通常はそれらを「アップストリーム」に送り返して、リポジトリに入れ、同じソースからプルした全員が同じ変更をすべて処理できるようにします。これは主に、ソース管理の技術的要件ではなく、誰もが自分の作業を調整する方法の社会的問題です。変更をメインプロジェクトに取り込み、異なる開発ラインを追跡しないようにします。

「アップストリーム」への変更の送信について話しているパッケージマネージャーまたはリリースマネージャー(ツールではなく人々)について読む場合があります。これは通常、システムのパッケージを作成できるように元のソースを調整する必要があったことを意味します。彼らはそれらの変更を続けたくないので、元のソースに「上流」に送信する場合、次のリリースで同じ問題に対処する必要はありません。


116
「ダウンロード」と「アップロード」は動詞です。「上流」と「下流」は相対的な位置を表します。
brian d foy 2015

2
上流と下流は形容詞だと思います
Crt

8
修飾語として使用される場合は形容詞ですが、これらの用語は名詞として使用されることがよくあります。
brian d foy 2017年

2
@MycrofDの単語は、文脈に応じて形容詞や名詞として使用できます
reggaeguitar

1
これは主に技術的な要件というよりは社会的な問題です。それでは、技術的な要件ではない-uようなオプションがあるのはなぜですか?できるかどうかに関係なく、技術要件です。しかし、違いは何ですか?git push --set-upstream origin masterpush -u originpush origin
グリーン

249

git tagmanページを読むと:

gitの1つの重要な側面は、gitが配布されることです。主に配布されるということは、システムに固有の「上流」または「下流」がないことを意味します。

、それは単純に絶対的な上流レポまたは下流レポがないことを意味します。
これらの概念は常に2つのリポジトリの間で相対的であり、データの流れ方に依存します。

「yourRepo」が「otherRepo」をリモートとして宣言している場合、次のようになります。

  • あなたがされている上流から引っ張って(「上流にある「otherRepo」「otherRepo」からあなた」、そしてあなたは「下流にあるため otherRepo」)。
  • あなたは上流にプッシュしています( "otherRepo"はまだ "上流"であり、情報は今戻る)。

「from」と「for」に注意してください。あなたは単に「下流」ではなく、「下流/から」なので、相対的な側面があります。


DVCS(Distributed Version Control System)の工夫は次のとおりです。実際にダウンストリームが何であるか、自分が宣言したリモートリポジトリに関連する独自のリポジトリのほかに何があるかわかりません。

  • あなたは上流が何であるかを知っています(あなたがプルしたりプッシュしたりしているリポジトリ)
  • あなたは、下流(他のリポジトリから引っ張ったりするプッシュで作られているのか分からない、あなたのレポ)。

基本的に:

データのフロー」に関して、あなたのリポジトリは、上流のリポジトリから来て(「プル」)、上流のリポジトリに戻って(同じまたは他の)フロー(「プッシュ」)の最下部(「ダウンストリーム」)にあります。 )。


git-rebasemanページの「UPSREAM REBASEからの回復」という段落の図を見ることができます。

これは、リベースが行われた「上流」のリポジトリからプルしていることを意味し、あなた(「下流」のリポジトリ)は結果(多くの重複するコミット)で立ち往生しています。ローカルで持っている)。

1つの "上流"リポジトリでは、多くの下流リポジトリ(つまり、リベースのブランチを持つ上流リポジトリからプルされたリポジトリ)が存在する可能性があり、それらすべてが重複するコミットを処理する必要がある可能性があるため、これは悪いことです。

繰り返しになりますが、「データの流れ」と同様に、DVCSでは、1つの悪いコマンド「アップストリーム」がダウンストリームに「波及効果」を持つ可能性があります。


注:これはデータに限定されません。gitコマンド(「磁器」コマンドなど)は他のgitコマンド(「配管」コマンド)を内部的に呼び出すことが多い
ためこれはパラメータにも適用されますrev-parsemanページを参照してください

多くのgit porcelainishコマンドは、フラグ(ダッシュ ' -' で始まるパラメーター)と、git rev-list内部で使用する基になるコマンド用のパラメーター、およびの下流で使用する他のコマンド用のフラグとパラメーターを組み合わせて使用​​しますgit rev-list。このコマンドは、それらを区別するために使用されます。


15
あなたはから引く上流の、そしてあなたがする押し上流。ダウンストリームへのプッシュは私には非常に間違っているように聞こえる
knittl

1
@knittl:その通りです。自分のローカル(および「下流」)リポジトリと比較した「上流」リポジトリの役割をよりよく示すために、私の回答を書き直しました。
VonC、2010年

85

上流(関連)追跡

用語は、上流 GITツールのスイートに来るとも特に相対的、いくつかの明確な意味を持って追跡

例えば ​​:

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

現在の作業ブランチの後ろ(左)と先(右)のコミット数(最後にキャッシュされた値)を、このローカルブランチの現在リモートブランチ追跡している(存在する場合)と比較して出力します。それ以外の場合は、エラーメッセージが出力されます。

    >error: No upstream branch found for ''
  • すでに述べたように、1つのローカルリポジトリには任意の数のリモートがある可能性があります。たとえば、githubからリポジトリをフォークしてから「プルリクエスト」を発行した場合、少なくとも2つありますorigin(フォークされたリポジトリgithub)とupstream(分岐したgithubのリポジトリ)。それらは単に交換可能な名前であり、 'git @ ...' urlのみがそれらを識別します。

あなたの.git/config読み取り:

   [remote "origin"]
       fetch = +refs/heads/*:refs/remotes/origin/*
       url = git@github.com:myusername/reponame.git
   [remote "upstream"]
       fetch = +refs/heads/*:refs/remotes/upstream/*
       url = git@github.com:authorname/reponame.git
  • 一方、GITに対する@ {upstream}の意味は独特です。

これは、リモートサイド」の「ブランチ」(存在する場合)であり、「ローカルリポジトリ」「現在のブランチ」を追跡しています。

これは、引数なしで単純なgit fetch/ を発行するたびにフェッチ/プルするブランチですgit pull

リモートブランチのオリジン/マスターを、チェックアウトしたローカルマスターブランチのトラッキングブランチに設定するとします。ちょうど発行:

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

これにより、2つのパラメータが追加されます.git/config

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

今試してください(「上流」リモートに「dev」ブランチがある場合)

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

.git/config 今読みます:

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

git-push(1)マニュアルページ

   -u
   --set-upstream

最新の、または正常にプッシュされたすべてのブランチに対して、引数なしのgit-pull(1)およびその他のコマンドで使用される上流(追跡)参照を追加します。詳細についてはbranch.<name>.merge、git-config(1)を参照してください。

git-config(1)マニュアルページ

   branch.<name>.merge

定義し、一緒にしてbranch.<name>.remote上流の特定のブランチについてのブランチ。マージするブランチをgit fetch / git pull / git rebaseに指示し、git pushにも影響を与える可能性があります(push.defaultを参照)。\(...)

   branch.<name>.remote

ブランチ<name>にあるとき、それはgit fetchとgit pushにどのリモートからフェッチする/プッシュするかを伝えます。リモートが構成されていない場合、デフォルトでoriginになります。originは、ブランチにいない場合にも使用されます。

アップストリームとプッシュ(Gotcha)

マニュアルページを見てgit-config(1)ください

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

これは、まだプッシュする準備ができていないブランチへの誤ったプッシュを防ぐためです。


4
git branch --help2018年時点の抜粋:As this option had confusing syntax, it is no longer supported. Please use --track or --set-upstream-to instead.
zezollo

59

それは少し非公式な用語です。

Gitに関する限り、他のすべてのリポジトリは単なるリモートです。

一般的に言えば、上流は(起点)からクローンした場所です。ダウンストリームは、自分の作業を他の作業と統合するプロジェクトです。

用語はGitリポジトリに限定されません。

たとえば、UbuntuはDebianの派生物であるため、DebianはUbuntuのアップストリームです。


51

有害と呼ばれる上流

悲しいかな、ここで他の答えが得られていない「上流」の別の使用法があります。つまり、リポジトリ内のコミットの親子関係を参照することです。Pro Gitブックの Scott Chacon は特にこの傾向があり、結果は残念です。この話し方を真似しないでください。

たとえば、彼は、これが原因で早送りが発生した結果、

マージしたブランチが指すコミットは、現在のコミットのすぐ上流にあった

彼は、コミットBがコミットAの唯一の子の...の唯一の子の唯一の子であることを言いたいので、BをAにマージするには、参照AをコミットBを指すように移動するだけで十分です。なぜこの方向「下流」ではなく「上流」と呼ばれるべきである、またはそのような純粋な直線グラフの形状が「直接上流」と記述されるべき理由は、完全に不明確であり、おそらく任意です。(git-merge「現在のブランチヘッドは名前付きコミットの祖先である」と書かれている場合、のmanページはこの関係を説明するはるかに優れた仕事をします。それはChaconが言ったはずのことです。)

確かに、チャコン自身は、削除されたコミットのすべての子コミットを書き換えることについて話すとき、後で「下流」を使用してまったく同じことを意味するように見えます。

このファイルをGit履歴から完全に削除するには、6df76からすべてのコミットを下流に書き直す必要があります

基本的に彼は、時間の経過とともにコミットの履歴を参照するときに、「上流」と「下流」が何を意味するのか明確な考えを持っていないようです。そのため、この使用は非公式であり、混乱を招くため、推奨されません。

すべてのコミット(1つを除く)には少なくとも1つの親があり、したがって親の親は祖先であることは完全に明らかです。逆に、コミットには子と子孫があります。これは一般に認められている用語であり、グラフの方向性を明確に説明しているため、レポのグラフジオメトリ内でコミットが相互にどのように関連しているかを説明したい場合は、この方法で説明します。この状況では、「上流」または「下流」を大まかに使用しないでください。

[追記:私が先に引用した最初のChacon文とgit-mergemanページの関係について考えていましたが、前者は後者の誤解に基づいているのではないかと思います。manページは、「アップストリーム」の使用が正当である状況を説明するために続きます:早送りは、「アップストリームリポジトリを追跡していて、ローカルの変更をコミットしておらず、新しいバージョンに更新したい場合によく発生します。アップストリームリビジョン。」したがって、おそらくチャコンが「上流」を使用したのは、マンページでそれを見たからです。しかし、manページにはリモートリポジトリがあります。Chaconが引用している早送りの例には、リモートリポジトリはなく、ローカルで作成された2つのブランチしかありません。]


14
git-rebaseのmanページもこの過負荷の影響を受けています。リベースの前にチェックアウトされるコミットは「アップストリーム」と呼ばれます。これもChaconの使用に影響を与えた可能性があります。
2014年

@outis奇妙-git htmlドキュメントでは、リベースする前にチェックアウトされたブランチはと呼ばれ<branch>ます。
Jesper Matthiesen、

いい視点ね。どこかで一般的な「git-terminology」を収集するのに役立つと思います。特に初心者(またはgitに貢献しているppl)の場合。gitのmanページの表現に慣れるのに十分な時間を節約できたでしょう。
SebNag 2017


1
git-rebaseコミット参照がそこで「上流」と呼ばれる理由を完全に混乱させたため、ドキュメントからここに来ました(実際、私はこの用語を見たことがないので自分自身を疑っていました)。物事を片付けるための@outisと@mattに感謝します!
Borek Bernard

0

一般に;

  • 上流はソースに向かっている
  • ダウンストリームはシンクまたは宛先に向かっています

これは、ソース管理システムを含むすべてのツリーのようなシステムに適用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.