“下游”和“上游”的定义

时间:2010-04-29 17:18:22

标签: git version-control versioning terminology definitions

我已经开始玩Git并遇到过“上游”和“下游”这两个词。我之前见过这些,但从未完全理解它们。这些术语在SCM(Software Configuration Management工具)和源代码的上下文中意味着什么?

5 个答案:

答案 0 :(得分:625)

在源代码管理方面,当您从存储库复制(克隆,签出等)时,您就是“下游”。信息流向“下游”给您。

当您进行更改时,通常需要将它们发送回“上游”,以便它们进入该存储库,以便从同一来源拉出的每个人都在使用所有相同的更改。这主要是每个人如何协调工作而不是源控制技术要求的社会问题。您希望将更改纳入主项目,因此您不会跟踪不同的开发线。

有时您会阅读有关提交“上游”更改的包或发布经理(人员,而不是工具)。这通常意味着他们必须调整原始来源,以便他们可以为他们的系统创建一个包。他们不想继续进行这些更改,所以如果他们将它们“上游”发送到原始来源,他们就不必在下一个版本中处理同样的问题。

答案 1 :(得分:217)

当您阅读git tag man page时:

  

git的一个重要方面是它是分布式的,并且分布很大意味着系统中没有固有的“上游”或“下游”。

,只需表示没有绝对上游回购或下游回购。
这些概念在两个回购之间总是相对的,取决于数据的流动方式:

如果“yourRepo”已将“otherRepo”声明为远程,则

  • 从上游拉“otherRepo”(“otherRepo”是“上游来自你”,你是“下游 otherRepo “)。
  • 推向上游(“otherRepo”仍然是“上游”,现在信息会回到上游)。

注意“from”和“for”:你不只是“下游”,你是“from / for ”的下游,因此是相对方面。


DVCS(分布式版本控制系统)的扭曲是:你不知道下游实际上是什么,除了你自己的回购相对于你声明的远程仓库。

  • 你知道上游是什么(你正在拉动或推动的回购)
  • 你不知道下游是由什么构成的(另一个回购拉动或推动你的回购)。

基本上:

在“数据流”方面,您的仓库位于来自上游回购(“拉动”)的流程的底部(“下游”)并返回到(相同或其他)上游回购(“推送到”)。


您可以在git-rebase man page中看到“从上游重拍回复”段落中的插图:

这意味着你从一个发生了rebase的“上游”仓库中撤出,并且你(“下游”仓库)被后果所困扰(许多重复提交,因为分支重新设置上游重新创建了本地相同分支的提交。

这很糟糕,因为对于一个“上游”回购,可以有 许多 下游回购(即回购从上游回购,带有重新分支),所有他们有可能处理重复的提交。

再次,对于“数据流”类比,在DVCS中,一个错误的命令“上游”可以在下游产生“涟漪效应”。


注意:这不仅限于数据 它也适用于参数,因为git命令(比如“瓷器”命令)经常在内部调用其他git命令(“plumbing”命令)。见rev-parse man page

  

许多git ceramicish命令混合使用标记(即以短划线“-”开头的参数)和用于内部使用的基础git rev-list命令的参数以及标记和参数他们在git rev-list 下游使用的其他命令。此命令用于区分它们。

答案 2 :(得分:81)

上游(与之相关)跟踪

上游这个术语在GIT工具套件中也有一些明确的含义,特别是相对于跟踪

例如:

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

将打印(最后缓存的值)当前工作分支后面(左)和前面(右)的提交数量,相对于( if any 当前跟踪此本地分支的远程分支。否则会打印错误信息:

    >error: No upstream branch found for ''
  • 如前所述,您可能拥有一个本地存储库的任意数量的远程数据库,例如,如果您从github分叉存储库,然后发出“拉取请求”,您肯定至少有两个:{{ 1}}(你在github上的分叉回购)和origin(你分叉的github上的回购)。这些只是可互换的名称,只有'git @ ...'url标识它们。
  

您的upstream读取:

.git/config
  • 另一方面, @ {upstream} 对GIT的意义是独一无二的:
  

'分支'(如果有)'表示远程',它跟踪'当前分支'在您的'本地存储库'

     

这是您在没有参数的情况下发出普通 [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 fetch时获取/提取的分支。

假设您希望将远程分支origin / master设置为您已检出的本地主分支的跟踪分支。刚发出:

git pull
     

这会在 $ git branch --set-upstream master origin/master > Branch master set up to track remote branch master from origin. 中添加2个参数:

.git/config
     

现在尝试(提供'上游'遥控器有'dev'分支)

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

$ git branch --set-upstream master upstream/dev > Branch master set up to track remote branch dev from upstream. 现在读取:

.git/config
     

git-push(1) Manual Page

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

对于每个最新或成功推送的分支,添加上游(跟踪)引用,由无参数git-pull(1)和其他命令使用。有关详细信息,请参阅git-config(1)中的 -u --set-upstream

     

git-config(1) Manual Page

branch.<name>.merge
     

branch.<name>.merge 一起定义给定分支的上游分支。它告诉git fetch / git pull / git rebase哪个分支合并,也可以影响git push(参见push.default)。   \   (...)

branch.<name>.remote
     

在分支时&lt;名称&gt;,它告诉git fetch和git push从哪个远程获取/推送到。如果未配置远程,则默认为origin。如果你不在任何分支上,也会使用原点。

上游和推送(Gotcha)

看看git-config(1) Manual Page

   branch.<name>.remote
     

这是为了防止意外推送到你尚未准备推进的树枝。

答案 3 :(得分:52)

这是一个非正式的术语。

就Git而言,每个其他存储库都只是一个遥控器。

一般来说,上游是你克隆的地方(原点)。下游是将您的作品与其他作品整合在一起的任何项目。

这些条款不仅限于Git存储库。

例如,Ubuntu是Debian派生物,因此Debian是Ubuntu的上游。

答案 4 :(得分:48)

上游被称为有害

另外,“上游”的另一个用途是,其他答案在这里没有得到,即在回购中引用提交的亲子关系。 Pro Git book中的斯科特·查孔特别容易发生这种情况,结果很不幸。不要模仿这种说法。

例如,他谈到合并会导致快速发生这种情况,因为

  

您合并的分支指向的提交是直接的   你正在进行提交的上游

他想说提交B是提交A的唯一子节点的唯一子节点的唯一子节点,因此要将B合并到A中,将ref A移动到指向提交B就足够了。为什么这个方向应该被称为“上游”而不是“下游”,或者为什么这种纯直线图的几何形状应该被描述为“直接上游”,这完全不清楚并且可能是任意的。 (当git-merge表示“当前分支头是命名提交的祖先”时,git-merge的手册页可以更好地解释这种关系。这就是Chacon应该说的那种。)< / p>

事实上,Chacon自己似乎后来使用“下游”来表示完全相同的事情,当他谈到重写已删除提交的所有子提交时:

  

您必须重写6df76下游的所有提交才能完全删除   来自Git历史记录的这个文件

基本上,当他提到一段时间内提交的历史时,他似乎并没有清楚地知道“上游”和“下游”的意思。这种用法是非正式的,不应该被鼓励,因为它只是令人困惑。

很明显,每个提交(除了一个)至少有一个父母,父母的父母就是祖先;在另一个方向,承诺有孩子和后代。这是公认的术语,并且明确地描述了图形的方向性,因此当您想要描述提交在回购的图形几何中如何相互关联时,就是谈话的方式。在这种情况下,不要松散地使用“上游”或“下游”。

[补充说明:我一直在考虑上面引用的第一个Chacon句子与{{1}}手册页之间的关系,而且我发现前者可能是基于对后者的误解。手册页继续描述使用“上游”是合法的情况:快速转发经常发生在“您正在跟踪上游存储库,您没有提交本地更改,现在您想要更新到更新上游修订。“所以也许Chacon使用“上游”,因为他在手册页中看到了它。但是在手册页中有一个远程存储库;在Chacon引用的快速转发示例中没有远程存储库,只有几个本地创建的分支。]