更改Git远程推送的默认设置

348

我想更改Git默认的远程分支目标,以便我只需要

git push

改为:

git push upstream

目前设置为远程源,我希望将其设置为其他远程源。

我尝试删除原始的(克隆自)远程源。

git remote rm origin

虽然它删除了原始远程,但没有解决git push问题。我仍然会收到以下错误信息:

  

致命错误:未配置推送目标。请在命令行中指定URL,或使用配置远程存储库...

我也尝试过调整:

git remote set-url --push myfork origin

还有其他选项,但似乎都不起作用(也许是因为我太快删除了原始远程?)

根据这里的答案,我尝试更改:

git config push.default upstream (or matching)

但是两者都没有起作用。


是的,但我的评论是默认消息,当您将问题标记为重复时。我这样做是因为我认为这个问题应该被关闭,作为我评论中链接的问题的副本。 - BuZZ-dEE
这个问题是在你的问题之前3年提出的。 - BuZZ-dEE
1
确实如此,但是这种行为既过于苛刻又带有滥用的倾向,关闭一个七年前的问题,并没有对社区有任何帮助。 - alonisser
我认为这对社区有所帮助。如果有人搜索这个主题,相关的问题会被链接起来。 - BuZZ-dEE
非常有用,谢谢 :) - brouk.develop
显示剩余3条评论
14个回答

349
您可以使用 git push -u <remote_name> <local_branch_name> 来设置默认的上游。有关更多详细信息,请参阅 git push 文档

3
无法工作:我得到了“致命错误:'origin'似乎不是git仓库,致命错误:远程终端意外挂断”的错误信息,可能是因为我在继续之前删除了origin远程仓库。刚刚找到了一个可行的解决方案,我会在答案中更新。 - alonisser
47
需要额外澄清的是,语法应为 git push -u <remote_name> <local_branch_name>:<对应的远程分支名> - Marco Lazzeri
44
git push -u origin master:master。 - starbeamrainbowlabs
4
@starbeamrainbowlabs git push -u origin master 不就够了吗?你只是在说明完整的语法吗? - Josiah Yoder
1
请注意,它不仅设置了默认的上游分支,还进行了推送。 - Jean Paul
显示剩余5条评论

171

要更改与您的分支“连接”的上游远程,请使用带有上游配置标志的git branch命令。

首先确保远程存在:

git remote -vv

设置当前(已检出)分支的首选远程:

git branch --set-upstream-to <remote-name>/<branch-name>

验证分支是否设置了正确的上游远程:

git branch -vv


3
刚刚尝试了git branch --set-upstream-to myfork命令,但是出现了错误:
error: unknown option `set-upstream-to' 我的git版本是1.7.9。
- alonisser
3
语法在1.8中有所改变,请参见https://dev59.com/mnRB5IYBdhLWcg3wxZ1K。 - jtniehof
2
请查看以下答案:https://dev59.com/OnE95IYBdhLWcg3wKqok#2432799 (git remote set-url origin PATH_TO_REMOTE) - Yinon Ehrlich
22
对我来说 git branch -u <remotename>/<branch> 很有效。该命令在已检出感兴趣的本地分支的情况下运行。请参阅 https://git-scm.com/book/zh/v2/Git-Branching-Remote-Branches 中的“跟踪分支”章节。 - norio
3
远程命令详细输出实际上只是 git remote -vgit remote --verbose-vv 中额外的 v 是多余的。 - Artif3x
显示剩余4条评论

93

使用 Git 2.3.2 进行工作...

git branch --set-upstream-to myfork/master

现在,statuspushpull指向myfork远程仓库。


3
当您只想将“pull”的默认设置为某个值时,可以使用这个方法。 - StingyJack
那是一个完美而简洁的答案。 - Ivan dal Bosco
1
这只适用于特定情况下的推送,通常需要匹配名称。请参阅 push.default - Tom Hale

57

你可以使用这个命令轻松地一次性更改所有分支的默认远程分支

git push -u <remote_name> --all

31
请注意,这将会推送所有更改,并且更改它们的上游远程仓库。 - poolie

26
如果你执行了 git push origin -u localBranchName:remoteBranchName 命令,然后连续执行 git push 命令时,出现了说 origin 不存在的错误,则按照以下步骤操作:
  1. git remote -v

检查是否存在不需要的远程,使用 git remote remove 'name' 删除它们。

  1. git config --edit

查找旧的或不存在的远程的可能标志。 查找 pushdefault

[remote]
  pushdefault = oldremote

更新oldremote的值并保存。

git push现在应该可以工作了。


2
谢谢!由于肌肉记忆,我在使用git push到不同的远程时倾向于添加-u。这会将给定的远程设置为默认值,使用git config --edit(或再次推送并设置新的远程)即可解决问题。 - Tim Visée
谢谢!这真的很有帮助,因为通常我会将原始名称更改为更具描述性的名称。老实说,我认为这是更好的答案,因为似乎问问题的人正在尝试重新定义源/默认远程存储库。 - codejedi365
这是我个人认为唯一能永久解决问题并应该被接受的答案。 - Lorenz Walthert

24

查看你的仓库中的 .git/config 文件可能会有所帮助,它会列出所有远程仓库以及每个分支的默认远程仓库。

例如:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@gitea.xxx.be:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

你可以在此文件中进行手动更改以移除不需要的远程,或更新您拥有的不同分支的默认远程

  • 注意!更改或删除远程时,请确保在此配置文件中更新所有对它的引用

15

仅作澄清(在ubuntu 12.04上使用git版本1.7.9.5):

Git会添加/删除远程。这些是带有服务器附加的git的远程实例。

git remote add myremote git://remoteurl
你可以这样获取git存储库:
git fetch myremote

看起来这会创建一个名为“myremote”的分支,然而该分支的远程设置不会自动完成。要解决这个问题,您需要执行以下步骤:

首先,请确认您有此问题,即:

git config -l | grep myremote

你应该能看到类似这样的内容:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

如果你看到 branch.myremote.remote=.,那么你应该继续进行:

git config branch.myremote.remote myremote
git checkout myremote
git pull

你现在应该与远程仓库保持同步,而且你的推送/拉取应该与相应的远程关联。你可以通过这种方式 按分支 切换远程仓库。[注][1]

根据 Git官方配置文档,你可以设置一个 默认 推送分支(只需在该页面上搜索remote.pushdefault),但请记住,这不会影响已经存在的存储库/分支,因此这仅适用于新的存储库/分支。你应该记住,--global 会设置特定于用户的存储库默认值(~/.gitconfig),--system 会设置系统范围的存储库默认值(/etc/gitconfig),而没有任何标志将为当前存储库(./.gitconfig)设置配置选项。

还应该注意,push.default 配置选项是用于配置 ref-spec 行为,而不是 远程 行为。

[1]: git branch --set-upstream myotherremote 通常可以在这里使用,但是如果使用 git branch --set-upstream myremote,git 将抱怨它不会将一个分支设置为它自己的远程。然而,我认为这是错误的行为。


不必使用 git config -l | grep myremote,你可以直接使用:git config --get branch.myremote.remote - Murmel
@Murmel 首先,这是一个社区维护的 wiki,所以请随时进行改进。其次,“--get” 命令假定了特定的行为方式,我要注意到还有其他设置上游的方法,但这提供了一种在不完全依赖 Git 工具正确性的情况下查找信息的方式。Git 并不完美,最好理解数据和它的作用,然后希望它的调用能够适当地发挥作用。 - smaudet

10

我刚发现另一种解决方法(即使我先删除了原始记录,这似乎是个错误),就是直接操作 git 配置:

git config remote.origin.url url-to-my-other-remote

6
这不是一个好的解决方案,Git 用户应该能够从多个存储库中拉取/推送 - 尽管这将允许您更改原始存储库的远程,但这并不意味着您应该更改原始存储库的远程,因为这很可能意味着远程之间存在许多不兼容性。合并会在这里有所帮助,但在新分支上设置远程既简单又保留了更多历史记录。 - smaudet
不是正确的做法... @Jordan 的答案更合适 - Raja Anbazhagan
1
参见:https://dev59.com/OnE95IYBdhLWcg3wKqok#2432799 (git remote set-url origin PATH_TO_REMOTE) - Yinon Ehrlich

9
在我的情况下,我通过以下方式修复了问题: * 运行git config --edit * 在git配置文件中:
[branch "master"]
remote = origin # <--- change the default origin here

8

简单地说,结合这里的一些很好的评论和我的个人研究,以下是解决此问题的步骤:

首先,检查您想要绑定到远程分支的本地分支:

git checkout mybranch

接下来:

git branch -u origin/mybranch

其中:

git branch -u {remote name}/{branch name}

您应该收到一条消息:
"Branch mybranch set up to track remote branch mybranch from origin."

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