git pull和git push有不同的默认远程(跟踪分支)。

10 浏览
0 Comments

git pull和git push有不同的默认远程(跟踪分支)。

有没有一种方法可以设置一个git仓库,使得git pull默认为一个远程仓库,而git push则默认为另一个远程仓库?我知道可以通过更改.git/config文件中分支部分的remote变量的值来设置两者,但如何分别为每个方向设置?

0
0 Comments

问题出现的原因:

在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..pushurl的解决方案更加灵活,因为你仍然可以为两个远程分支设置跟踪分支。是否需要或者想要这种灵活性取决于你自己。

根据发布说明,这个选项特别添加是为了支持三角工作流。

一些讨论:

有人认为应该将这个选项命名为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指定的远程分支。这个解决方案更加灵活,因为仍然可以为两个远程分支设置跟踪分支。

0
0 Comments

在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中不小心重复了冒号。

0
0 Comments

不同的默认远程(跟踪分支)对于git pull和git push的原因是什么?

在Git 1.6.4及更高版本中,可以使用git config来设置remote..pushurl。使用这个功能可以在使用只读的https协议进行pull操作时,使用基于ssh的协议进行push操作。

假设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”分支拉取最新代码。这两个操作都是在同一个远程仓库中进行的。

0