一个项目在 Git 中可以有两个(或更多)“起源”吗?
具体来说,添加 github 存储库时会出现此错误:
$ git remote add origin https://github.com/Company_Name/repository_name.git
fatal: remote origin already exists.
一个项目在 Git 中可以有两个(或更多)“起源”吗?
具体来说,添加 github 存储库时会出现此错误:
$ git remote add origin https://github.com/Company_Name/repository_name.git
fatal: remote origin already exists.
您可以拥有任意数量的遥控器,但您只能拥有一个名为“origin”的遥控器。名为“origin”的远程没有任何特殊之处,只是它是 Git 在克隆现有存储库时创建的默认远程。您可以配置第二个遥控器,向该遥控器推送/拉取,并设置一些分支以跟踪来自该遥控器而不是来源的分支。
尝试添加一个名为“github”的遥控器:
$ git remote add github https://github.com/Company_Name/repository_name.git
# push master to github
$ git push github master
# Push my-branch to github and set it to track github/my-branch
$ git push -u github my-branch
# Make some existing branch track github instead of origin
$ git branch --set-upstream other-branch github/other-branch
值得注意的是,一次可以将原始推送到多个git 存储库服务器。
可以通过使用以下命令将另一个 URL 添加到源远程来实现此目的。
git remote set-url --add origin ssh://git@bitbucket.org/user/myproject.git
这是一个包含多个遥控器、GitHub 和 GitLab 的示例项目:
为 GitHub 添加远程仓库
$ git remote add github https://github.com/Company_Name/repository_name.git
为 GitLab 添加远程仓库
$ git remote add gitlab https://gitlab.com/Company_Name/repository_name.git
现在您在项目中有多个遥控器。仔细检查git remote -v
$ git remote -v
github https://github.com/Company_Name/repository_name.git (fetch)
github https://github.com/Company_Name/repository_name.git (push)
gitlab https://gitlab.com/Company_Name/repository_name.git (fetch)
gitlab https://gitlab.com/Company_Name/repository_name.git (push)
你如何推送到多个存储库?
$ git push github && git push gitlab
git remote set-url --add --push origin git@github.com:user/my-project.git
git remote set-url --add --push origin git@bitbucket.org:user/my-project.git
现在你有 2 个起源。
一个本地存储库可以链接到多个远程存储库。
但是,只能调用其中一个链接origin
。其余的链接需要有不同的名称。
因此,为了正确回答这个问题,我们需要了解什么是起源。
让我用一个例子来解释。
假设您有一个remote repository
被调用的amazing-project
,然后您将该远程存储库克隆到您的本地计算机,以便您有一个local repository
. 然后你会得到如下图所示的内容:
因为您克隆了存储库。远程存储库和本地存储库是链接的。
如果您运行该命令git remote -v
,它将列出链接到本地存储库的所有远程存储库。在那里,您将看到为了从远程存储库推送或获取代码,您将使用短名称“origin”。
现在,这可能有点令人困惑,因为在 GitHub(或远程服务器)中,该项目被称为“amazing-project”。那么为什么看起来远程存储库有两个名称呢?
好吧,我们的存储库的名称之一是它在 GitHub 或某个远程服务器上的名称。这可能有点像项目名称。在我们的案例中,这就是“惊人的项目”。
我们的存储库的另一个名称是它在本地存储库中的短名称,它与存储库的 URL 相关。每当我们想从该远程存储库推送或获取代码时,我们将使用它的简称。这种短名称就像 url 的别名,它是我们避免使用整个长 url 来推送或获取代码的一种方式。在我们上面的例子中,它被称为origin
.
那么,什么是origin
?
基本上 origin 是Git 在克隆远程存储库时用于远程存储库的默认短名称。所以它只是默认的。
在许多情况下,您将拥有指向本地存储库中多个远程存储库的链接,并且每个存储库都有不同的短名称。
所以最后一个问题,为什么我们不使用相同的名称?
我将用另一个例子来回答这个问题。假设我们有一个朋友分叉了我们的远程存储库,以便他们可以在我们的项目上帮助我们。假设我们希望能够从他们的远程存储库中获取代码。我们可以使用该命令git remote add <shortname> <url>
在本地存储库中添加指向其远程存储库的链接。
在上图中,您可以看到我使用短名称friend
来引用我朋友的远程存储库。您还可以看到两个远程存储库具有相同的项目名称amazing-project
,这给了我们一个原因,为什么远程服务器中的远程存储库名称和我们本地存储库中的短名称不应该相同!
您可以通过提供不同的名称而不是来源来将另一个远程帐户添加到您的存储库。您可以使用名称,例如 origin2。所以你的 git 命令可以修改为
git remote add origin2 https://github.com/Company_Name/repository_name.git
git remote add origin2 https://github.com/Company_Name/repository_name.git
并用于推送:
git push -u origin2 master
您可以按照以下步骤将更改从现有存储库推送到新的远程。
cd existing_repo
重命名您当前的遥控器(可选)
git remote rename origin old-origin
添加新遥控器(此处使用原点)
git remote add origin https://github.com/repository_name.git
现在您可以将代码推送到新的origin
遥控器
git push -u origin --all
git push -u origin --tags
您可以使用 GitHub 或 GitLab 而不是 origin
对于 github 代替原产地使用 github
git remote add github https://github.com/repository_name.git
git push github branchname
对于 gitlab 代替原产地使用 gitlab
git remote add gitlab https://github.com/repository_name.git
git push gitlab branchname