什么是Git中的“起源”?

当我跑:

git push origin branchname

究竟什么是origin,为什么我必须在分支名称之前键入它?

316133 次浏览

origin是特定远程存储库的别名在您的系统。它实际上不是该存储库的属性。

通过做

git push origin branchname

您是说推送到origin存储库。不需要将远程存储库命名为origin:事实上,同一个存储库可能对另一个开发人员有不同的别名。

雷姆特只是一个别名,用于存储存储库的URL。您可以通过使用

git remote -v

push命令中,您可以使用遥控器,也可以直接使用url。使用URL的示例:

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

Git有“远程”的概念,它们只是存储库其他副本的URL。当您克隆另一个存储库时,Git会自动创建一个名为“起源”的远程并指向它。

您可以通过键入git remote show origin查看有关遥控器的更多信息。

origin是远程存储库URL的默认别名

origin没有远程存储库名称。它更像是本地别名设置为密钥以代替远程存储库URL。

它避免了用户在提示推送时必须键入整个远程URL。

第一次从远程克隆时,Git默认设置此名称并用于约定。

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

git remote rename origin mynewalias

查看http://git-scm.com/docs/git-remote以获得进一步的澄清。

我也对此感到困惑,下面是我所学到的。

当您克隆存储库时,例如从GitHub:

  • origin是您从中克隆存储库的URL的别名。请注意,您可以更改此别名。

  • 远程存储库中有一个master分支(由origin别名)。还有另一个本地创建的master分支。

更多信息可以从这个问题中找到:Git分支:主vs.起源/主vs.远程/起源/主

当您使用git clone克隆存储库时,它会自动创建一个名为origin的远程连接,指向回克隆的存储库。这对于创建中央存储库的本地副本的开发人员很有用,因为它提供了一种简单的方法来拉取上游更改或发布本地提交。这种行为也是大多数基于Git的项目调用其中央存储库源的原因。

简单!当您运行这样的命令时,“起源”就是您昵称的远程存储库:

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

从那时起,Git知道“起源”指向该特定的存储库(在本例中为GitHub存储库)。您可以将其命名为“github”或“repo”或任何您想要的名称。

最佳答案在这里:

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

在Git中,“起源”是远程存储库的简写名称 Project最初是从克隆的。更准确地说,它被用来代替 原始存储库的URL-从而使引用变得更多 更容易

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

在Git中,“起源”是最初克隆项目的远程存储库的简写名称。更准确地说,它被用来代替原始存储库的URL——从而使引用变得更容易。

请注意,起源绝不是一个“神奇”的名字,而只是一个标准的约定。尽管保持这个约定不变是有意义的,但你可以完美地重命名它而不会失去任何功能。

在以下示例中,“clone”命令的URL参数成为克隆的本地存储库的“源”:

git clone https://github.com/gittower/git-crash-course.git

其他答案说origin是远程存储库url的别名,这并不完全准确。应该注意的是,以http开头的地址是URL,而以git@开头的地址是URI或通用资源标识符。

所有URL都是URI,但并非所有URI都是URL。

简而言之,当您键入git remote add origin <URI>时,您是在告诉您的本地git,每当您使用origin这个词时,您实际上是指您指定的URI。把它想象成一个保存值的变量。

就像一个变量一样,你可以随意命名它(例如githubherokudestination等)。

远程(仓库url别名)→起源(上游别名)→大师(分支别名);

  • remote,与working directoryindexrepository

  • origin,本地仓库分支映射到远程仓库分支

Origin简称,其作用类似于远程存储库url的别名

让我用一个例子来解释。

假设您有一个名为amazing-projectremote repository,然后您将该远程存储库克隆到本地计算机,这样您就有了一个local repository。然后您将拥有如下图所示的内容:

在此处输入图片描述

因为您克隆了存储库。远程存储库和本地存储库是链接

如果您运行命令git remote -v,它将列出链接到本地存储库的所有远程存储库。在那里,您将看到为了从远程存储库推送或获取代码,您将使用简称“起源”。 输入图片描述

现在,这可能有点令人困惑,因为在GitHub(或远程服务器)中,项目被称为'amamy-project'。那么为什么远程存储库看起来有两个名称呢?

在此处输入图片描述

我们存储库的名称之一是它在GitHub或某个远程服务器上的名称。这可以像项目名称一样思考。在我们的例子中,这是“惊人的项目”。

我们存储库的另一个名称是简称,它位于我们的本地存储库中,与存储库的URL相关。每当我们想从该远程存储库推送或获取代码时,它都将使用这个短名称。这个短名称有点像URL的别名,这是我们避免不得不使用整个长URL来推送或获取代码的一种方式。在上面的示例中,它被称为origin

什么是origin

基本上,原始是Git在克隆远程存储库时用于远程存储库的默认简称。所以它只是默认

在许多情况下,您将在本地存储库中拥有多个远程存储库的链接,并且每个链接都有不同的短名称。

最后一个问题,为什么我们不使用相同的名字?

我将用另一个例子来回答这个问题。假设我们有一个朋友分叉了我们的远程存储库,这样他们就可以帮助我们完成我们的项目。假设我们希望能够从他们的远程存储库中获取代码。我们可以使用命令git remote add <shortname> <url>在我们的本地存储库中添加一个指向他们远程存储库的链接。

在此处输入图片描述

在上图中,您可以看到我使用简称friend来指代我朋友的远程存储库。您还可以看到两个远程存储库都有相同的项目名称amazing-project,这给了我们一个原因,为什么远程服务器中的远程存储库名称和我们本地存储库中的短名称不应该相同!

有一个非常有用的视频📹可以解释所有这些,可以找到这里

我只想补充一点,如果您将遥控器视为您可能想要将代码移动到的计算机以外的位置,那么很容易理解。

一些很好的例子是:

  • github
  • 托管您的应用程序的服务器

所以你当然可以有多个遥控器。一个非常常见的模式是使用GitHub来存储你的代码,一个服务器来托管你的应用程序(如果是Web应用程序)。那么你将有两个遥控器(如果你有其他环境,可能更多)。

尝试通过键入git config -e打开您的git配置

注意:按逃脱,然后:,然后q,然后输入退出

示例

如果您有3个遥控器,您可能会在git配置中看到以下内容。在这个例子中,1个遥控器(称为“起源”)是GitHub,另一个遥控器(称为“登台”)是登台服务器,第三个(称为“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将推送到“[远程”起源”]的URL,即GitHub

但类似地,我们可以使用git push staging推送到另一个远程,例如“[远程”暂存”],然后它将推送到https://git.heroku.com/warm-bedlands-98000.git

在上面的例子中,我们可以看到3个带有git remote的遥控器:

git remote
heroku
origin
staging

摘要或origin

遥控器只是互联网上你可能有理由将代码发送到的地方。GitHub是一个显而易见的地方,托管你的应用程序的服务器也是如此,你可能也有其他位置。git push origin只是意味着它将推送到“源”,这是GitHub选择默认的名称。

关于branchname

branchname只是你对远程的push。根据git推送帮助文档,branchname参数在技术上是一个refspec,出于实际目的,它是你想要推送的分支。

  • 通过运行git push在文档中阅读更多内容:git push --help