Git “的定义;“下游”;及;“上游”;

Git “的定义;“下游”;及;“上游”;,git,version-control,versioning,terminology,definition,Git,Version Control,Versioning,Terminology,Definition,我开始使用Git,遇到了“上游”和“下游”这两个术语。我以前见过这些,但从来没有完全理解过。这些术语在SCMs(工具)和源代码的上下文中是什么意思?在源代码管理方面,当您从存储库复制(克隆、签出等)时,您是“下游的”。信息向你“下游”流动 当您进行更改时,通常希望将它们发回“上游”,以便它们进入该存储库,以便来自同一来源的每个人都在处理所有相同的更改。这主要是一个关于每个人如何协调工作的社会问题,而不是源代码控制的技术要求。您希望在主项目中进行更改,这样就不会跟踪不同的开发线 有时,您会读到关于

我开始使用Git,遇到了“上游”和“下游”这两个术语。我以前见过这些,但从来没有完全理解过。这些术语在SCMs(工具)和源代码的上下文中是什么意思?

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

当您进行更改时,通常希望将它们发回“上游”,以便它们进入该存储库,以便来自同一来源的每个人都在处理所有相同的更改。这主要是一个关于每个人如何协调工作的社会问题,而不是源代码控制的技术要求。您希望在主项目中进行更改,这样就不会跟踪不同的开发线


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

这是一个非正式的术语

就Git而言,其他所有存储库都只是一个远程存储库

一般来说,上游是你克隆的起点。下游是任何将您的工作与其他工作相结合的项目

这些术语并不局限于Git存储库

例如,Ubuntu是Debian的衍生产品,因此Debian是Ubuntu的上游。

当您阅读时:

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

,这意味着没有绝对的上游回购或下游回购。
这些概念在两次回购之间始终是相对的,取决于数据流动的方式:

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

  • 您从上游拉动其他回购(“其他回购”是“上游您”,您是“下游其他回购”)
  • 您正在推向上游(“otherRepo”仍然是“上游”,信息现在返回到上游)
注意“from”和“for”:你不仅仅是“下游”,你是“下游from/for”,因此是相对方面


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

  • 你知道上游是什么(你从或推动的回购协议)
  • 你不知道下游是由什么组成的(其他回购协议从你的回购协议中退出或推进)
基本上:

就“数据流”而言,您的回购处于来自上游回购(“拉入”)和返回(相同或其他)上游回购(“推入”)的流的底部(“下游”)。


您可以在中看到“从上游再基准恢复”一段的插图:

这意味着您正从发生重新基准的“上游”回购中退出,而您(“下游”回购)将承受后果(大量重复提交,因为重新基准的上游分支重新创建了您在本地拥有的同一分支的提交)

这是不好的,因为对于一个“上游”回购,可能会有多个下游回购(即,回购从上游回购,带有重定基础的分支),所有这些回购都有可能处理重复提交

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


注:这不限于数据。
它也适用于参数,因为git命令(如“陶瓷”命令)通常在内部调用其他git命令(“管道”命令)。见:

许多git porcelainish命令混合使用标志(即以破折号“
-
”开头的参数)和用于内部使用的底层
git rev list
命令的参数,以及用于
git rev list下游的其他命令的标志和参数。此命令用于区分它们

上游(与之相关)跟踪 术语上游对于GIT工具套件也有一些明确的含义,尤其是相对于跟踪

例如:

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

    >error: No upstream branch found for ''
  • 如前所述,对于一个本地存储库,您可能有任意数量的远程设备,例如,如果您从github分支存储库,然后发出“拉请求”,那么您肯定至少有两个:
    origin
    (您在github上的分支repo)和
    upper
    (您在github上分支的repo)。这些只是可互换的名字,只有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
  • 另一方面,@{upstream}对GIT的含义是独特的:
是“所述远程”上的“分支”(如果有),它正在跟踪“本地存储库”上的“当前分支”。

无论何时发出无参数的普通
git-fetch
/
git-pull
,它都是从中获取/提取的分支

假设您想将远程分支原点/主节点设置为b
   [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 branch --set-upstream  master origin/master
   > Branch master set up to track remote branch master from origin.
   [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.
   [branch "master"]
       remote = upstream
       merge = refs/heads/dev
   -u
   --set-upstream
   branch.<name>.merge
   branch.<name>.remote
   git config --global push.default upstream
   git config --global push.default tracking  (deprecated)