“下游”和“上游”的定义
我已经开始玩Git,并且遇到了“上游”和“下游”的条款。 我以前见过这些,但从未完全理解它们。 这些术语在SCM和源代码中意味着什么?
在源代码控制方面,当您从存储库复制(克隆,签出等)时,您就是“ 下游 ”。 信息流向你的“下游”。
当您进行更改时,通常希望将它们发送回“ 上游 ”,以便将它们放入该存储库,以便从同一来源提取的所有人都可以进行所有相同的更改。 这主要是每个人如何协调工作的社会问题,而不是源控制的技术要求。 你想要将你的改变放到主项目中,这样你就不会跟踪不同的发展路线。
有时你会阅读关于提交“上游”更改的软件包或发布管理器(人员,而不是工具)。 这通常意味着他们必须调整原始来源,以便为他们的系统创建一个包。 他们不想继续进行这些更改,因此如果他们将这些更改“上游”发送给原始来源,则他们不应在下一个版本中处理同一问题。
当你阅读git tag
手册页时:
git的一个重要方面是它是分布式的,并且分布在很大程度上意味着系统中没有固有的“上游”或“下游”。
这仅仅意味着没有绝对的上游回购或下游回购。
这些概念总是相对于两个回购之间的关系,并取决于数据流的方式:
如果“yourRepo”声明“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 ''
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 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?