在源代码控制方面,你是“ 的 下游 强> “当您从存储库复制(克隆,签出等)时。信息流向”下游“给您。
当您进行更改时,通常需要将其发回“ 的 上游 强> “所以他们进入那个存储库,这样每个人都可以从相同的源代码处理所有相同的变化。这主要是一个社会问题,关于每个人如何协调他们的工作而不是源控制的技术要求。你想得到您对主项目的更改,因此您不会跟踪不同的开发线。
有时您会阅读有关提交“上游”更改的包或发布经理(人员,而不是工具)。这通常意味着他们必须调整原始来源,以便他们可以为他们的系统创建一个包。他们不想继续进行这些更改,因此如果他们将它们“上游”发送到原始源,他们就不必在下一个版本中处理相同的问题。
术语 的 上游 强> 对GIT工具套件也有一些明确的含义,特别是相对于 的 追踪 强>
例如 :
$git rev-list --count --left-right "@{upstream}"...HEAD >4 12 将打印(最后一个缓存的值)当前工作分支后面(左)和前面(右)的提交数量,相对于( 的 如果有的话 强> ) 目前跟踪远程分支 对于这个本地分支。否则将打印错误消息: >error: No upstream branch found for ''
$git rev-list --count --left-right "@{upstream}"...HEAD >4 12
将打印(最后一个缓存的值)当前工作分支后面(左)和前面(右)的提交数量,相对于( 的 如果有的话 强> ) 目前跟踪远程分支 对于这个本地分支。否则将打印错误消息:
>error: No upstream branch found for ''
origin
upstream
您的 .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/config 读:
.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 fetch / git pull ,没有争论。
的 它是 '分支' (如果有的话) '说远程' ,这是跟踪 '当前分支' 在你的 '本地存储库' 。 强>
它是你发布普通平台时获取/拉出的分支 git fetch / git pull ,没有争论。
git fetch
git pull
假设想要将远程分支origin / master设置为您已检出的本地主分支的跟踪分支。刚发出:
$ 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 对于每个最新或成功推送的分支,请添加 的 上游(跟踪) 强> 引用,由argument-less 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 在分支时&lt;名称&gt;,它告诉git fetch和git push从哪个远程获取/推送到。如果未配置远程,则默认为origin。如果您不在任何分支上,也会使用原点。
$ 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) 强> 手册页 :
git-push(1)
-u --set-upstream
对于每个最新或成功推送的分支,请添加 的 上游(跟踪) 强> 引用,由argument-less git-pull(1)和其他命令使用。有关更多信息,请参阅 branch.<name>.merge 在git-config(1)中。
branch.<name>.merge
的 git-config(1) 强> 手册页 :
git-config(1)
与...一起定义 branch.<name>.remote , 的 上游 强> 给定分支的分支。它告诉git fetch / git pull / git rebase哪个分支合并,也可以影响git push(参见push.default)。 \ (......)
branch.<name>.remote
在分支时&lt;名称&gt;,它告诉git fetch和git push从哪个远程获取/推送到。如果未配置远程,则默认为origin。如果您不在任何分支上,也会使用原点。
看一眼 git-config(1) 手册页
git config --global push.default upstream git config --global push.default tracking (deprecated) 这是为了防止意外推到你尚未准备推进的树枝上。
git config --global push.default upstream git config --global push.default tracking (deprecated)
这是为了防止意外推到你尚未准备推进的树枝上。
唉,另一个使用“上游”,其他答案在这里没有得到,即在回购中引用提交的亲子关系。斯科特查康在 Pro Git书 特别容易出现这种情况,结果很不幸。不要模仿这种说法。
例如,他说合并导致快速发生,因为这发生了
您合并的分支指向的提交是直接的 在你提交的上游
他想说提交B是提交A的唯一子节点的唯一子节点的唯一子节点,因此将B合并到A中就足以将ref A移动到指向提交B.为什么这个方向应该被称为“上游”而不是“下游”,或者为什么这种纯直线图的几何形状应该被描述为“直接上游”,完全不清楚并且可能是任意的。 (手册页) git-merge 当它说“当前的分支头是命名提交的祖先”时,可以更好地解释这种关系。这是Chacon应该说的那种。)
git-merge
事实上,Chacon自己似乎后来使用“下游”来表示完全相同的事情,当他谈到重写已删除提交的所有子提交时:
您必须重写6df76下游的所有提交才能完全删除 来自Git历史的这个文件
基本上,当他提到随着时间的推移历史时,他似乎并没有清楚地知道“上游”和“下游”的含义。这种使用是非正式的,然后,不要鼓励,因为它只是令人困惑。
很明显,每个提交(除了一个)至少有一个父母,父母的父母就是祖先;在另一个方向,承诺有孩子和后代。这是公认的术语,并且明确地描述了图形的方向性,因此当您想要描述提交在回购的图形几何中如何相互关联时,就是谈话的方式。在这种情况下,不要松散地使用“上游”或“下游”。
[补充说明:我一直在考虑我上面引用的第一个Chacon句子与之间的关系 git-merge man page,我发现前者可能是基于对后者的误解。手册页继续描述使用“上游”是合法的情况:快速转发经常发生在“您正在跟踪上游存储库,您没有提交本地更改,现在您想要更新到更新上游修订。“所以也许Chacon使用“上游”,因为他在手册页中看到了它。但是在手册页中有一个远程存储库;在Chacon引用的快速转发示例中没有远程存储库,只有几个本地创建的分支。
当你读完 git tag 手册页 :
git tag
git的一个重要方面是它是分布式的,并且分布很大意味着系统中没有固有的“上游”或“下游”。
那简单 的 意味着没有 绝对 上游回购或下游回购。 这些概念在两个回购之间总是相对的,取决于数据的流动方式: 强>
的 如果“yourRepo”已声明“otherRepo”为远程,那么 强> :
注意“from”和“for”:你不仅仅是“下游”,而是“下游” 从/对 “,因此相对方面。
DVCS(分布式版本控制系统)扭曲是:你不知道下游实际上是什么,除了你自己的repo相对于你声明的远程仓库。
基本上:
的 就...而言 ” 数据流 “,您的仓库位于来自上游仓库(”从中拉出“)并返回(相同或其他)上游仓库(”推送到“)的流量的底部(”下游“)。 强>
你可以看到一个插图 git-rebase 手册页 与“从上游重新恢复”段落:
git-rebase
这意味着你 的 从一个发生变革的“上游”仓库撤出 强> ,你(“下游”回购)坚持后果(许多重复提交,因为上游的分支重新创建了你在本地拥有的同一分支的提交)。
这很糟糕,因为对于一个“上游”回购,可能会有 的 许多 强> 下游回购(即,从上游回收的回购,具有重新分支),所有这些都有可能处理重复的提交。
的 再次,与“数据流”类比,在DVCS中,一个错误的命令“上游”可以具有“ 连锁反应 “下游。 强>
注意:这不仅限于数据。 的 它也适用于参数 强> ,因为git命令(比如“瓷器”命令)经常在内部调用其他git命令(“plumbing”命令)。看到 rev-parse 手册页 :
rev-parse
许多git ceramicish命令混合使用标记(即以破折号开头的参数) - ')和参数意味着潜在的 git rev-list 他们在内部使用的命令 的 他们在下游使用的其他命令的标志和参数 git rev-list 强> 。此命令用于区分它们。
-
git rev-list
这是一些非正式的术语。
就Git而言,每个其他存储库都只是一个远程存储库。
一般来说,上游是您克隆的地方(原点)。下游是将您的作品与其他作品整合在一起的任何项目。
这些条款不仅限于Git存储库。
例如,Ubuntu是Debian衍生产品,因此Debian是Ubuntu的上游产品。