一个项目可以有多个起源吗?

289

一个项目可以在Git中有两个或多个“起点”吗?

我想将一个项目推送到githubHeroku服务器。

具体地,当添加github存储库时出现以下错误:

$ git remote add origin https://github.com/Company_Name/repository_name.git
fatal: remote origin already exists.

11
您可以拥有尽可能多的远程代码库,但必须给它们不同的名称。 - Felix Kling
这种情况下仓库名称不同。单词“origin”是可更改的名称吗? - Chris Dutrow
4
是的,git remote rename <old> <new>可以进行重命名:http://linux.die.net/man/1/git-remote。但你也可以将Github仓库命名为不同的名称... - Felix Kling
1
可能是pull/push from multiple remote locations的重复问题。 - AD7six
并且是否可以将其中一个远程设置为默认值,这样每次推送时就不必显式地编写该远程的名称了? - 40detectives
补充@FelixKling的评论: 您还可以将相同的URL映射到不同的远程,这意味着<https或ssh URL>可以作为两个不同的远程添加 - originupstream(您可以随意命名)。 - Srishti Gupta
9个回答

410
编辑:如果你想配置一个单独的远程仓库(无论是origin还是其他)来推送到多个上游仓库,这是可以实现的。请参阅Git - 向两个远程仓库推送代码
你可以拥有任意多个遥控器,但是只能有一个名为“origin”的遥控器。名为“origin”的遥控器在任何方面都没有特殊之处,只是在克隆现有存储库时,Git创建的默认遥控器。你可以配置第二个遥控器,推送/拉取该遥控器,并设置一些分支来跟踪该遥控器的分支,而不是origin。
试试添加一个名为“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

5
根据可能与本问题重复的答案中获得最高票数的答案,远程可以指多个存储库。因此,您可以将内容推送到一个远程并更新两个或更多的存储库,但不清楚这是否是原帖作者的目标。 - AD7six
但是,为什么你想要这样做的一些实际例子呢?为什么你会将一个目录指向多个存储库?每个存储库通常都有自己专用的目录。 - Daniel
4
几乎所有部署到Heroku的人都有一个名为“origin”的远程仓库和一个名为“heroku”的远程仓库。 - user229044
@mightyspaj,如果你的团队正在使用fork并且有时想要访问它们。我们在与不同UTC的团队合作时这样做,以便当我们批准PR时,我们可以使用他们的fork进行rebase/push,并能够立即合并代码,而不是明天。 - Benoit Drapeau
有没有一种方式可以将所有本地分支一次性推送到新远程分支? - Tanasis
显示剩余3条评论

132

需要注意的是,可以同时将代码提交到多个git仓库服务器。

使用以下命令向origin远程仓库添加另一个URL即可实现此目的。

git remote set-url --add origin ssh://git@bitbucket.org/user/myproject.git

8
关于这个问题的更多思考,请参见此问题 - moi
3
我该如何删除其中一个起点而不删除所有起点? - Michael
@Michael 你可以编辑 ./git/config 文件,并移除 [remote "origin"] 部分下的 url 文件。 - Pini Cheyni
8
您好,这是一条关于 Git 命令的翻译。原文:git remote set-url --delete origin ssh://git@bitbucket.org/user/myproject.git翻译:这条命令可以删除 Git 中某个仓库的远程地址,具体操作为:将 origin 这个名字的远程仓库地址设为空,即可删除它。要执行此操作,请在终端中输入以上命令,并将 ssh://git@bitbucket.org/user/myproject.git 替换为您想要删除的远程仓库地址。 - Afrig Aminuddin
2
嘿,有人可以把这个标记为正确答案吗? - enanone
显示剩余2条评论

68

这是一个带有多个远程仓库(GitHub和GitLab)的示例项目:

  1. 为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
    

    4
    只运行 $ git push 命令会把代码推送到所有远程库吗? - Water Cooler v2
    我们在尝试将代码推送到Github时遇到了问题,它会自动推送到Gitlab。你能帮我解决一下吗?我想一个一个地推送到origin。 - Mitul Marsoniya
    如果我在GitLab中有两个项目、两个代码库,我该如何处理?我从一个项目获取代码,然后将其推送到另一个项目中? - Muzi Jack

    16
    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个起源。


    3
    由于使用了--push选项,这个答案比其他答案更加有帮助/精炼。 - Dmitri Zaitsev
    1
    这正是我想要的。从旧源拉取,但为了备份目的将其推送到新源! - moutaigua8183

    13

    一个本地库可以链接到多个远程库。但其中只能有一个链接称为 origin,其余的链接需要拥有不同的名称。

    因此,为了正确回答这个问题,我们需要先了解什么是 origin。

    让我们用一个例子来解释。

    假设你有一个名为 amazing-project 的远程库,然后你将该远程库克隆到你的本地机器上,这样你就有了一个本地库。那么你会得到如下图所示的内容:

    enter image description here

    因为你克隆了该库,所以远程库和本地库是链接在一起的。

    如果你运行命令 git remote -v,它将列出所有已链接到你的本地库的远程库。在那里,你将看到为了从远程库推送或获取代码,你将使用短名称'origin'。 enter image description here

    现在可能有点令人困惑,因为在GitHub(或远程服务器)中,项目被称为“amazing-project”。那么为什么似乎有两个名称指向远程存储库呢?

    图片描述

    实际上,我们的存储库有两个名称。第一个名称是它在GitHub或远程服务器上的名称。可以将其视为项目名称,在本例中为“amazing-project”。

    另一个名称是它在我们本地存储库中的短名称,与存储库的URL相关联。每当我们想要从远程存储库中推送或获取代码时,都会使用这个短名称。这种短名称就像该URL的别名,它使我们无需使用整个长URL就能够推送或获取代码。在上面的示例中,它被称为origin

    那么,什么是origin

    基本上,当您克隆远程存储库时,origin是Git用于远程存储库的默认短名称。因此,它只是一个默认值

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

    那么最后一个问题,为什么我们不直接使用相同的名称呢?

    我将用另一个例子来回答这个问题。假设我们有一个朋友分叉了我们的远程代码库,以便他们可以帮助我们完成项目。并且让我们假设我们想要能够从他们的远程代码库获取代码。我们可以使用命令git remote add <shortname> <url>,以将链接添加到我们本地代码库中的他们的远程代码库。

    enter image description here

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

    有一个非常有帮助的视频对此进行了说明,可以在这里找到。


    5
    你可以按照以下步骤,将你在现有仓库中的更改推送到新的远程仓库。
    cd existing_repo
    

    重命名您当前的远程库(可选)

    git remote rename origin old-origin
    

    添加新的远程仓库(这里使用了origin)

    git remote add origin https://github.com/repository_name.git
    

    现在你可以将你的代码推送到新的origin远程仓库。
    git push -u origin --all
    git push -u origin --tags
    

    3

    可以使用 GitHub 或 GitLab,而不是 origin。

    要使用 GitHub,请使用 github 代替 origin。

    git remote add github https://github.com/repository_name.git
    git push github branchname
    

    使用GitLab代替原始版本。
    git remote add gitlab https://github.com/repository_name.git
    git push gitlab branchname
    

    3

    您可以通过使用不同的名称(如origin2)为您的存储库添加另一个远程帐户。这样,您的git命令就可以进行修改:

    git remote add origin2 https://github.com/Company_Name/repository_name.git
    

    3
    git remote add origin2 https://github.com/Company_Name/repository_name.git
    

    并且用于推送使用:

    git push -u origin2 master
    

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