git命令中的'origin'和'remote'有什么区别?

86
在git术语中,originremote是同一个东西吗?还是origin指的是本地目录?
git push -u origin master的情况下:以下哪种解释是正确的?
  1. "将所有内容推送到名为'origin'且其分支为'master'的远程库"
  2. "从名为'origin'的本地源库推送所有内容到上游的'master'分支"
感谢任何澄清!
对我的问题的答案澄清了两个问题:
  1. origin指的是远程存储库,而不是远程存储库的本地克隆副本。当人们阅读originremote的别名,并在执行git clone时创建时,这一点并不清楚。
  2. origingit push -u origin master中指的是远程存储库,因为暗示了本地存储库副本,并且"很少被引用"。

14
git remote 是一个命令,而 git origin 不是。 - Bergi
当你读到“origin是remote的别名”时,你很可能误解了那段内容。 - Sergio Tulentsev
2
我通常认为“origin”是一个远程库的名称。你可以选择任何名称来创建多个远程库,例如upstream、downstream、mirror-n、work-server、home-server等等。 - Toby
3
其他回答把这个问题复杂化了。简单来说,“origin”只是一个“远程”(意味着不在你本地)Git存储库的名称(默认名称)。 - David S.
5个回答

90
在Git术语中,origin只是远程仓库的默认名称,从该仓库最初克隆。它也可以被称为sourceremote1或者只是remote
请记住,git是一个点对点分布式系统,没有任何内置的客户端/服务器、主/从、父/子关系的概念(尽管用户可能会在特定场景下强制执行这些关系)。
所有远程仓库都是平等的。对于克隆的仓库来说,origin只是(字面上)同等中的第一个。
正如Jan在评论中指出的那样,与每个远程仓库相关联的名称是为您方便而设计的。如果您发现origin实际上不适合您,那么可以更改它。
至于您对push语句的解释,您的第一个解释最接近正确,但是按照写入的方式,push命令将本地的master分支推送到由(本地配置的)名称origin标识的远程master分支。
如果远程仓库中没有master分支,则会创建一个。 完整的push命令及其标志,选项等详细信息当然可以在文档中找到。 由于您的操作是在repo的上下文中执行的,因此很少(如果有)明确引用“local” repo。

1
所有的远程仓库都是平等的。origin 只是(字面上)这些平等仓库中的第一个。请注意,您可以随时更改别名,甚至从与中央仓库不同的源进行初始克隆,然后再更改 origin。 - John Dvorak
2
@Jan - 是的,说得好。我已经更新了答案以指出这一点(并注明了您的评论)。 :) - Deltics
如何同步我的原始URL和远程URL以确保心安? - JacobTheKnitter
@JacobTheKnitter - 我不确定你所说的“同步”是什么意思。任何一个仓库都有一组配置好的远程仓库,但没有必要在涉及的对等方之间“同步”它们。Repo A 可能将 B 和 C 作为远程仓库,而 C 只将 B 作为远程仓库(或根本没有远程仓库),D 将 A 作为远程仓库,但没有 B 或 C。这些关系中没有对称性或互惠的要求。 - Deltics

21
不是同一意思。
在Git中,“remote”指的是任何远程仓库,比如你的GitHub或其他Git服务器。
“origin”是Git中默认的远程名称(按照惯例)。当你使用“git clone ”命令时,“”会自动添加到本地存储库中,并使用名称“origin”。当然,你可以使用“git remote add”命令添加其他不同名称的远程仓库。
当你运行“git push -u origin master”命令时,它的含义是“将本地的master分支推送到名为‘origin’的远程仓库”。这个命令的结构是比较通用的——更通用的形式是“git push -u ”,它会将名为“branch”的分支推送到指定的远程仓库,在远程仓库中创建该分支(如果远程仓库尚不存在该分支,则会使用“-u”标志)。
另外,需要注意的是,“git push”默认将当前分支推送到“origin”,相当于“git push origin ”。

12

你可以拥有多个远程仓库,每个仓库都可以用不同的名字表示,比如默认的“origin”

你的问题假设你当前已经检出了主分支。

git push -u origin master

将名为master的本地分支推送到远程的"origin"仓库,命名为master。-u标志告诉本地git将该远程分支作为上游跟踪你的本地分支。


5
一个remote只是一个单词:用于标识其他Git存储库的名称。
字符串origin是默认名称,当您从其他(“原始”)Git存储库克隆时,git clone会自动添加它作为(唯一的)远程。 您可以选择其他名称和/或添加更多远程。每个远程至少具有一个URL,其中包含要找到其他存储库的位置。
对于git push,第三个单词(如果需要,请调整此数字,如果您添加了各种标志;在这种情况下,您添加了-u,因此现在是第四个单词)通常是某个远程的名称。
其余的单词都是refspecs,可以概括为一对由冒号分隔的分支名称(尽管不是100%准确的...实际上,不到50%准确,这取决于如何计算:-))。
如果您只写一个分支名称,例如master,则Git将把它解释为“使用(部分)上游(如果设置),否则使用冒号后面的相同名称。”通常,如果已设置上游,则上游具有相同的基本名称,因此master通常意味着master:master。 Git发送找到在您的分支(左侧的名称)上的提交-然后要求它们将他们的分支(右侧的名称)设置为刚刚推送的相同提示提交,针对该分支。
如果您不输入任何refspecs,则Git的默认值取决于您的Git版本。自Git版本2.0以来,默认设置是将您的当前分支推送到远程具有相同名称的分支。 -u标志告诉git push,如果推送成功,它应该设置您刚刚推送的分支的上游。
分支的upstream由两个部分组成:远程的名称和该远程上的分支的名称。由于您给出了git push的这两个项目-远程的名称是origin,而分支是隐含的master:master中的第二个(冒号后面)master -如果成功,这将将master的上游设置为origin/master

(编辑:您可能会很合理地想知道在origin/master上游设置中/来自哪里。这在某种程度上是历史遗留问题,但不幸的是它导致了巨大的混淆。目前,只需记住在Git中远程分支远程跟踪分支都是不同的东西。它们在各种方式上相关,但要记住它们不是相同的,并且术语具有非常具体的含义。单词track也有多重含义。新术语upstream更好,但并不是所有描述都使用它。)


2
不,remoteorigin 的父结构。这只是 Git 在克隆存储库时创建的默认名称。

有关更多信息,请参见此问题:Git 中的“origin”是什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接