git pull和git push有不同的默认远程(跟踪分支)。
问题出现的原因:
在Git 1.8.3之前,git pull和git push的默认远程分支是相同的,即将pull和push操作都发送到相同的远程分支。然而,有时我们可能希望在pull和push操作中使用不同的默认远程分支。在这种情况下,Git没有提供直接的方法来设置不同的默认远程分支,这导致了这个问题的出现。
问题的解决方法:
从Git 1.8.3开始,可以使用remote.pushDefault选项来实现不同的默认远程分支设置。可以像设置其他选项一样,使用git config remote.pushDefault命令来设置它。例如,要将其设置为pushTarget远程分支,可以使用以下命令:
git config remote.pushDefault pushTarget
这个选项会产生以下效果:
- git pull将从.git/config中相关分支部分的remote选项指定的远程分支进行pull操作。
- git push将推送到remote.pushDefault指定的远程分支。
需要注意的是,需要指定一个远程分支的名称,而不是URL。这使得这个解决方案比涉及remote.
根据发布说明,这个选项特别添加是为了支持三角工作流。
一些讨论:
有人认为应该将这个选项命名为pullDefault而不是pushDefault,以更好地反映其作用。因为在pull操作中,默认远程分支通常称为upstream,而不是pushDefault。然而,其他人认为默认远程分支通常是upstream,因为我们通常只有一个或者很少几个上游分支,而下游分支可以有多个或者不知道具体数量。这是分布式版本控制系统的特点。
在Git 1.8.3之后,可以使用remote.pushDefault选项来设置不同的默认远程分支,实现在git pull和git push操作中使用不同的默认远程分支。通过设置remote.pushDefault选项,git pull将从.git/config中相关分支部分的remote选项指定的远程分支进行pull操作,而git push将推送到remote.pushDefault指定的远程分支。这个解决方案更加灵活,因为仍然可以为两个远程分支设置跟踪分支。
在Git版本1.7.0之后,可以通过以下方式设置默认的push URL:
git remote set-url --push origin https://your.push.com/blah/
这个回答是在问题提出3年后给出的,但应该成为新的被接受的答案!为什么?接受答案不一定意味着它是“最好的”答案,而是解决了提问者的问题(请阅读FAQ获取更多信息)。在提问问题时,上述答案可能不起作用(甚至不存在),因为git版本早于1.8。然而,这个被接受的答案确实解决了提问者的问题。请问你在三年后为什么要改变提问者的决定呢?
Stack Overflow也是一个为未来的访问者提供有用答案的地方,这些访问者可能通过搜索引擎或其他方式找到这个问题。让最佳答案出现在首位是很有价值的。我不是说提问者必须改变被接受的答案,但我认为这样做是完全合理的(在我看来是一个净积极的行为)。
这个回答也没有回答到问题。
那么关于使用HTTPS的pull部分呢?使用pull
会导致error: unknown option 'pull'
的错误。
1. 这里涉及到的是fetch,pull只是fetch+merge 2. 你必须以相反的方式进行操作
我刚试过把SSH作为默认(pull)URL,HTTPS作为push URL,但没有成功,出现了关于URL的奇怪错误。
对不起,那是我的愚蠢错误,我在URL中不小心重复了冒号。
不同的默认远程(跟踪分支)对于git pull和git push的原因是什么?
在Git 1.6.4及更高版本中,可以使用git config来设置remote.
假设origin的url(remote.origin.url)是https://git.example.com/some/repo.git。虽然是只读的,但是你可以通过基于ssh的URL git.example.com:some/repo.git进行写入。运行以下命令来设置使用ssh协议进行push操作:
git config remote.origin.pushurl git.example.com:some/repo.git
如何使push操作发送到一个名为“development”的分支,而pull操作来自于一个名为“production”的分支,它们在同一个远程+bare Git仓库中?
可以通过以下步骤来实现:
1. 首先,使用git branch命令创建一个名为“development”的分支:
git branch development
2. 使用git checkout命令切换到“development”分支:
git checkout development
3. 使用git push命令将当前分支推送到远程仓库的“development”分支:
git push origin development
4. 接下来,使用git branch命令创建一个名为“production”的分支:
git branch production
5. 使用git checkout命令切换到“production”分支:
git checkout production
6. 使用git pull命令从远程仓库的“production”分支拉取最新代码:
git pull origin production
这样,push操作就会将代码推送到“development”分支,而pull操作会从“production”分支拉取最新代码。这两个操作都是在同一个远程仓库中进行的。