Git中的“origin”是什么?

765

当我运行:

git push origin branchname

origin 究竟是什么,为什么我在分支名称前面要输入它?


90
"origin" 是你想要发布提交记录的远程代码库的名称。按照惯例,默认的远程代码库被称为 "origin",但是你可以同时使用多个具有不同名称的远程代码库。更多信息请参考这里(例如):http://gitref.org/remotes/ - Benoit Courtine
1
请注意,origin是一个“上游”存储库:请参阅https://dev59.com/QHE85IYBdhLWcg3whD3j#2749166。 - VonC
3
可能是 What's the meaning of 'origin' in 'git push origin master' 的重复内容。 - nawfal
但是当使用git fetch,然后git branch -r时,本地分支会以origin/为前缀,真是让人头疼 :-/ https://www.atlassian.com/git/tutorials/syncing/git-fetch - brat
1
请查看.git\config文件,其中包含别名到URL的映射,.git文件夹默认是隐藏的。 - Abhijeet Patel
12个回答

744

origin 是你系统中特定远程仓库的别名。它实际上不是该仓库的属性。

通过执行

git push origin branchname

你的意思是将代码推送到名为origin的远程仓库。实际上,没有必要给远程仓库命名为origin,同一个仓库也可以为其他开发者使用不同的别名。

远程仓库只是存储仓库URL的别名。您可以使用以下命令查看每个远程仓库对应的URL:

git remote -v

push命令中,您可以使用远程,也可以直接使用URL。以下是一个使用URL的示例:

git push git@github.com:git/git.git master

2
一个远程仓库可以作为多个其他远程仓库的别名吗?如果我想要一个远程仓库推送到多个其他远程仓库怎么办?例如,推送到主要仓库和备份仓库?在某些情况下,这是否是一个合理的需求?编辑:这里有几个解决方案。 - Yankee
2
如果我省略 "origin" 关键字会怎样?当我们说 "git push" 时,它不是会将所有提交推送到远程仓库吗?添加 "origin" 关键字似乎是多余的。 - Mugen
2
git push的文档中,您可以看到它首先检查该存储库的配置(您可以使用git config --list检查)是否存在一个名为branch.<branchname>.remote的键。如果未设置,则“默认为origin”-https://git-scm.com/docs/git-push - Kenmore

204

origin并不是远程仓库的名称,而是在远程仓库URL的位置上设置为键的本地别名

这样可以避免用户在提示推送时输入整个远程URL。

Git在首次从远程克隆时默认设置此名称以供约定使用。

该别名不是硬编码的,并且可以使用以下命令提示更改:

git remote rename origin mynewalias

请查看http://git-scm.com/docs/git-remote以获取更多澄清信息。


4
如果我省略了"origin"关键字,那么当我们输入"git push"命令时,它不会把所有的提交推送到远程仓库吗?加上"origin"关键字是否是多余的呢? - Mugen
默认情况下,origin 已经设置好了。如果你看到 "git remote -v";因此,当你省略 origin 时,它会默认连接到远程 URL :-) - Krishna

84

Git有“远程仓库”的概念,它们只是指向其他副本的URL。当你克隆另一个仓库时,Git会自动创建一个名为“origin”的远程,并将其指向该仓库。

您可以通过输入git remote show origin来查看有关远程的更多信息。


1
Git命令对于初学者来说非常混乱。我猜这与版本控制系统的历史有关。所以问题是:为什么不直接使用git show origin而是要用git remote show origin?肯定有原因,是什么呢?谢谢。 - Stack0verflow
7
@Stack0verflow: 这可能更适合作为一个新问题提出,这样人们就可以进行研究,如果你感到好奇的话。'git show'已经是另一个显示提交的命令了,从技术上讲,除了拥有一个名为origin的远程之外,没有任何东西会阻止你拥有一个名为'origin'的分支... - Jason Malinowski

53

origin是您远程仓库URL的默认别名


42

Origin是一个类似于远程仓库url的简称,可以作为其别名

我们来看一个例子。

假设你有一个名为amazing-project远程仓库,然后你将该远程仓库克隆到本地机器上,以便拥有一个本地仓库。那么你会得到下面图示中所示的内容:

enter image description here

因为你克隆了代码仓库,远程代码仓库和本地代码仓库是相互关联的。如果你运行命令git remote -v,它将列出所有与你的本地代码仓库相连的远程代码仓库。在那里,你会看到为了从远程代码仓库推送或拉取代码,你需要使用“origin”这个简称enter image description here这可能有点令人困惑,因为在GitHub(或远程服务器)中,该项目被称为“amazing-project”。那么为什么似乎有两个名称代表远程代码仓库呢?

enter image description here

我们仓库的名字有两个,一个是在GitHub或远程服务器上的名字,可以看作是项目名,例如' amazing-project'。另一个是与仓库URL相关的本地仓库的短名称,当我们想要从远程仓库推送或获取代码时会用到它。这个短名称就像是URL的别名,让我们避免使用整个长URL来推送或获取代码。在这个例子中,它被称为“origin”。
实际上,“origin”是Git在克隆远程仓库时用于远程仓库的默认短名称。
通常情况下,本地仓库会链接到多个远程仓库,每个远程仓库都有不同的短名称。
为什么我们不直接使用相同的名称呢?举个例子,假设我们的朋友fork了我们的远程仓库以帮助我们的项目,我们想从他们的远程仓库获取代码,我们可以使用命令“git remote add ”将链接添加到我们的本地仓库中。

enter image description here

在上面的图片中,您可以看到我使用了短名称friend来引用我的朋友的远程存储库。 您还可以看到两个远程存储库都具有相同的项目名称amazing-project,这就是为什么远程服务器中的远程存储库名称和本地存储库中的短名称不应该相同的原因之一!
有一个非常有帮助的视频解释了所有这些内容,可以在此处找到。

3
这真的比被采纳的答案更好地帮助我理解了!谢谢@Anna Skoulikari! - Uraforclain

32

简单!"origin"只是你在类似这样的命令中给你的远程仓库起的昵称:

git remote add origin git@github.com:USERNAME/REPOSITORY-NAME.git

从那时起,Git 知道 "origin" 指向特定的存储库(在这种情况下是 GitHub 存储库)。你可以将其命名为 "github"、"repo" 或其他任何你想要的名称。


24

我之前也对此感到困惑,以下是我学到的内容。

当你克隆一个仓库(比如从GitHub):

  • origin 是从中克隆仓库的URL的别名。请注意,你可以更改这个别名。

  • 远程仓库中有一个名为 master 的分支(由 origin 别名引用)。本地也会创建另一个名为 master 的分支。

更多信息可以在这个SO问题中找到:Git branching: master vs. origin/master vs. remotes/origin/master


7
我想补充一点,如果你把远程仓库看作是与你的计算机不同的位置,可以很容易地理解。这些位置可以是你要将代码移动到的其他地方。
一些很好的例子包括:
- GitHub - 服务器来托管你的应用程序
因此,你可以有多个远程仓库。一个非常常见的模式是使用 GitHub 存储代码,使用一个服务器来托管应用程序(如果是 Web 应用程序)。那么你就会有两个远程仓库(如果有其他环境,则可能会更多)。
尝试通过输入“git config -e”来打开你的 Git 配置文件。
注意:按 esc,然后输入 :,然后输入 q,最后按 enter 退出。
示例:
以下是如果你有三个远程仓库时在 Git 配置中可能看到的内容。在此示例中,一个远程仓库(称为“origin”)是 GitHub,另一个远程仓库(称为“staging”)是一个演练服务器,第三个远程仓库(称为“heroku”)是一个生产服务器。
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = https://github.com/username/reponame.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[remote "heroku"]
        url = https://git.heroku.com/appname.git
        fetch = +refs/heads/*:refs/remotes/heroku/*
[remote "staging"]
        url = https://git.heroku.com/warm-bedlands-98000.git
        fetch = +refs/heads/*:refs/remotes/staging/*

[remote ... 开头的三行显示了我们可以推送到的远程仓库。

运行 git push origin 会将代码推送到 '[remote "origin"]' 对应的 url,也就是 GitHub。

类似地,我们也可以通过执行 git push staging 将代码推送到另一个名为 '[remote "staging"]' 的远程仓库,这个例子中会将代码推送至 https://git.heroku.com/warm-bedlands-98000.git

在上面的例子中,我们可以使用 git remote 命令查看当前存在的三个远程仓库。

git remote   
heroku
origin
staging

概述或起源

远程存储库(Remotes)是您可以将代码发送到的互联网位置。GitHub是一个显而易见的地方,托管应用程序的服务器也是如此,您可能还有其他位置。git push origin表示它将推送到“origin”,这是GitHub选择默认使用的名称。

至于分支名称

分支名称就是您要将其push到远程的内容。根据git push文档,branchname参数在技术上是一个refspec,但实际上是您想要推送的分支。

  • 通过运行:git push --help可在git push文档中了解更多内容。

7

这里最好的答案:

https://www.git-tower.com/learn/git/glossary/origin

在Git中,“origin”是一个简写的名称,表示一个项目最初从哪个远程仓库克隆而来。更准确地说,它代替了原始仓库的URL,因此使得引用变得更加容易。

3
其他回答说origin是远程仓库的URL的别名,这并不完全准确。需要注意的是,以http开头的地址是URL,而以git@开头的地址是URI或统一资源标识符。
所有URL都是URI,但不是所有URI都是URL。
简而言之,当您键入git remote add origin <URI>时,您告诉本地的git,每当您使用单词origin时,实际上是指定的URI。可以将其视为保存值的变量。
就像变量一样,您可以随意命名它(例如githubherokudestination等)。

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