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

我已经开始玩Git,并且遇到了“上游”和“下游”的条款。 我以前见过这些,但从未完全理解它们。 这些术语在SCM和源代码中意味着什么?


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

当您进行更改时,通常希望将它们发送回“ 上游 ”,以便将它们放入该存储库,以便从同一来源提取的所有人都可以进行所有相同的更改。 这主要是每个人如何协调工作的社会问题,而不是源控制的技术要求。 你想要将你的改变放到主项目中,这样你就不会跟踪不同的发展路线。

有时你会阅读关于提交“上游”更改的软件包或发布管理器(人员,而不是工具)。 这通常意味着他们必须调整原始来源,以便为他们的系统创建一个包。 他们不想继续进行这些更改,因此如果他们将这些更改“上游”发送给原始来源,则他们不应在下一个版本中处理同一问题。


当你阅读git tag手册页时:

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

这仅仅意味着没有绝对的上游回购或下游回购。
这些概念总是相对于两个回购之间的关系,并取决于数据流的方式:

如果“yourRepo”声明“otherRepo”是远程的,那么

  • 要从上游 “otherRepo” (“otherRepo”是“上游你”,你是“ otherRepo下游”)。
  • 你正在向上游推进 (“otherRepo”仍然是“上游”,信息现在回到上游)。
  • 注意“from”和“for”:你不仅仅是“下游”,你是“下游/为了”,因此是相对的方面。


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

  • 你知道上游是什么(你正在从或推动的回购)
  • 你不知道下游是由什么构成的(另一个回购是从你的回购仓库中拉出来的)。
  • 基本上:

    在“数据流”一词,存放区是在一个流的底部(“下游”)从上游回购来(“从拉”),并回到(相同或其它)上游回购(“推到” )。


    您可以在git-rebase手册页中看到一个插图,其中的段落“RECOVERING FROM UPSTREAM REBASE”:

    这意味着你是从“上游”回购,其中一个底垫发生拉扯 ,而你(“下游”回购)被套牢的后果(大量的重复提交,因为分支衍合上游重建同一分支的提交你有本地)。

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

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


    注意:这不限于数据。
    它也适用于参数 ,因为git命令(如“瓷器”命令)经常在内部调用其他git命令(“管道”命令)。 请参阅rev-parse手册页:

    许多GIT中porcelainish命令采取标志的混合物(即以短划线开始参数“ - ”)和意味着底层参数git rev-list它们内部使用命令和标志和参数为他们所使用的下游的其它命令git rev-list 。 该命令用于区分它们。


    上游(与相关)的跟踪

    术语上游对于GIT工具套件也有一些明确的含义,特别是与跟踪有关

    例如 :

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

    将打印当前工作分支后面(左)和前面(右)相对于当前正在跟踪该本地分支的远程分支( 如果有的话 )的提交数量(最后一个缓存值)。 否则会打印一条错误消息:

        >error: No upstream branch found for ''
    
  • 正如已经说过的,你可能有一个本地仓库的远程数据库,例如,如果你从github上分发一个仓库,然后发出'pull request',你肯定至少有两个: origin (你的分叉回购在github上)和upstream (您在github upstream的回购)。 这些只是可互换的名称,只有'git @ ...'网址标识它们。
  • 您的.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.
    

    这在.git/config添加了2个参数:

       [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)和其他命令使用的上游(跟踪)引用。 有关更多信息,请参阅git-config(1)中的branch.<name>.merge

    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从哪个远程获取/推送到。 如果没有配置远程,它默认为原点。 如果您不在任何分支上,也会使用原点。

    上游和推(Gotcha)

    看看git-config(1)手册页

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

    这是为了防止意外推送到尚未准备推送的分行。

    链接地址: http://www.djcxy.com/p/7177.html

    上一篇: Definition of "downstream" and "upstream"

    下一篇: What is the precise meaning of "ours" and "theirs" in git?