What is the difference between origin and upstream on GitHub?
Github上的origin和upstream有什么区别?
当执行git branch -a命令时,某些分支的前缀为origin(remotes/origin/..),而其他分支的前缀为upstream(remotes/upstream/..)。
这应该在Github forks的上下文中理解(在本地克隆该fork之前,在Github上分叉Github repo)。
- upstream一般是指你已经分叉的原始回购。(关于upstream术语的更多信息,请参见"downstream和"upstream的定义")。
- origin是你的叉子:你自己在github上的回购,是github原始回购的克隆。
从Github页面:
When a repo is cloned, it has a default remote called origin that points to your fork on GitHub, not the original repo it was forked from.
To keep track of the original repo, you need to add another remote named upstream
号
1
| git remote add upstream git://github.com// |
(使用aUser/aRepo作为您分叉的原始创建者和存储库的参考)
您将使用upstream从原始回购中获取(以便使您的本地副本与您要贡献的项目保持同步)。
号
(默认情况下,仅凭git fetch一项就可以从origin取得,这不是这里需要的)
您将使用origin进行拉和推,因为您可以为自己的存储库做出贡献。
(同样,在没有参数的情况下,默认使用"origin")。
您将通过发出请求,为upstream回购作出贡献。
。
- 它还有助于了解upstream的一般情况:stackoverflow.com/questions/2739376/…
- 值得一提的是,在Github的上下文中,让origin成为主repo并使用Github用户名作为您和其他fork的远程名称更有意义。像defunkt.io/hub这样的工具可以做到这一点,并使跨fork的工作和协作更加统一。
- @Maxrydahlandersen是真的,但我喜欢使用不带包装的Git,所以我现在将保留该约定(上游与源站)。
- 到目前为止,我所看到的关于叉子如何工作的最好解释。你得到我的赞成票。
- 视觉效果很好。非常直截了当和易懂的回答。这正是我要找的。
- 使用云(hub/bucket/etc)作为主源,克隆要托管的包(服务器上的其他地方)的场景如何?服务器上的这个repo是下游的主要dev,甚至可能是唯一的dev,但不希望这样限制它。你想让云成为明显的上游。但是,您会添加一个原点,将其设置为相同的,还是为这个特殊的prod repo删除一个原点?从那里克隆到他们的用户空间的devs,它们的源成为这个服务器repo(prod),但问题是服务器repo源,而不是devs克隆。
- 哦,在我的场景中,云是图中的"原始",服务器是我想的"分叉"。这样,另一个团队就可以把叉子插到另一个服务器上,如果需要更多的团队,也就是说,前后分离,或者其他任何原因,都可以清洗和重复。那么,叉子是否可以没有原点,或者是否需要(为了方便)将其设置为与上游相同(在这种情况下),或者更好的建议?.
- @野蔷薇"那么,叉子能没有起源吗":最好是把叉子作为起源的原始repo,以便记住这个叉子是从哪个repo来的。
- @VONC不知道这是怎么搞混的,假设你只有上游,你知道的,在做git remote -v的时候,如果只指定上游,在我的情况下,除非你提到其他时间,也许是推的时候?这可能就是我要问的,如果我只有上游,没有源头,这会如何影响推/拉?或者,这是否是一个正确的(可选的)方式来暗示来源,而不是指定,只是指定上游?或者,它是反模式使用,只支持双重指定,还是应该只添加源代码,并为prod保留上游空值?
- @在这一点上,你最好问一个新的问题,你清楚地阐述了你的具体情况。
- @VONC-我在Github上创建了一个回购(不是分叉的)。因为我在上游添加了指向回购本身的分支,所以看到所有这些分支(上游分支和原始分支)是正常的吗?如果我理解正确,它指向同一个回购,所以当我承诺其中一个时,我实际上是在写同一个回购,不是吗?
- @iamrudra如果git remote-v为origin和upstream显示相同的URL,那么是的,您将推到相同的远程repo。
- @VONC——刚刚检查过——它们确实是一样的。非常感谢!
- 这是否意味着git fetch将从upstream和git pull获得来自origin的信息?
- @frankmeulear默认为no:fetch单独从您的fork(即origin)中获取。但在任何时候,你都可以选择从上游取:git fetch upstream。
- 我可能不知何故错过了这一点,但upstream是否意味着任何特定的东西,或者它只是在Git中处理forks时使用的常规名称,例如,您可以使用任何名称来代替它吗?
- @Stigperez这是一个命名约定,这里引用您分叉的原始回购。另见上游的定义(stackoverflow.com/a/2749166/6309)。您可以使用另一个名称,但通常考虑使用上游名称。
- 因此,考虑到这一点,如果我是唯一一个在分支机构工作的人(并且在回购协议方面),我不需要在该分支机构工作。只需在本地工作->git add->git commit->git push,对吗?
- @是的,没错。在那种情况下不需要叉子。
- @VONC谢谢,我对上游的选择很疯狂。当我使用comeone-else repo/branch时是必需的,因为Git将原始repo的副本实例化到我的repo中。然后,使用upstream选项,我告诉Git"链接"我拥有的副本到原始副本,以便我可以最终由原始所有者对pull进行更改,对吗?
- @GLC78是的,这是一般的想法。