Git推送:设置分支目标

35

我想用以下命令推送我的当前分支(hp1):

git push

而不是

git push origin hp1:team/hp1
远程分支已经存在。 我的本地分支:
develop
master
* hp1

运行git remote show origin命令后,我得到以下信息:

Remote branches:
  develop  tracked
  master   tracked
  team/h2  tracked
  team/hp1 tracked
  team/n1  tracked
Local branches configured for 'git pull':
  develop  merges with remote develop
  master   merges with remote master
  hp1 merges with remote team/hp1
Local refs configured for 'git push':
  master   pushes to master   (up to date)

我已经尝试过

git branch --set-upstream hp1 origin/team/hp1

git branch --set-upstream hp1 refs/remotes/origin/team/hp1

但两个都不起作用。

我的同事将本地分支命名为远程分支(team/hp1),上面的代码对他有效。最后,他会得到额外的

Local refs configured for 'git push':
  develop  pushes to develop  (up to date)
  master   pushes to master   (up to date)
  team/hp1 pushes to team/hp1 (up to date)

也许您可以告诉我哪里出了问题以及如何修复。

编辑 我的配置:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ***@***:***.git
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "hp1"]
    remote = origin
    merge = refs/heads/team/hp1
4个回答

51

首先,在第一次推送时,执行以下操作:

git push -u origin hp1:team/hp1

关于 -u 选项:

-u
--set-upstream

对于每个已经更新到最新状态或成功推送的分支,添加上游(跟踪)引用,供无参数的 git-pull(1) 和其他命令使用。更多信息请参见 git-config(1) 中的 branch..merge。

注意手册中指出,这本身不会决定下次执行 git push 时会发生什么。当您在此分支中执行 git pull 时,它将从您设置的上游获取它。但是,在推送时,它将推送到匹配的分支(在此示例中为 hp1,而不是 team/hp1)。

为了使其起作用,您必须将 push.default 配置值设置为 upstream。一旦设置了这个值,当您从一个分支推送(只需执行 git push),它将按照 branch.<name>.merge 所提到的上游进行推送。

因此,请执行以下操作:

git config push.default upstream

关于 push.default:

push.default

定义了在 git push 命令中没有给出 refspec、远程仓库没有配置 refspec,以及命令行参数中没有任何选项暗示了 refspec 的情况下,git push 应该执行的操作。可能的值包括:

nothing - 不推送任何内容。

matching - 推送所有匹配的分支。在两端都具有相同名称的所有分支被认为是匹配的。这是默认值。

upstream - 将当前分支推送到其上游分支。

tracking - upstream 的废弃同义词。

current - 将当前分支推送到同名分支。


谢谢,解释得非常好!我现在也明白了,为什么我的同事不设置push.default也能正常工作。 - m1schka
push.default 的另一个取值是 simple,类似于 upstream,但如果上游分支的名称与本地分支不同,则拒绝推送。 - MathKid

4
(March 2012): 注意:在 git1.7.10+ 版本之后,“上游”策略可能很快成为默认策略:
请参考 "Please discuss: what "git push" should do when you do not say what to push?"。
在当前设置中(即 push.default=matching),不带参数的 git push 将推送所有与本地同名的远程分支。这通常适用于开发者向自己的公共存储库推送代码,但在使用共享存储库时可能会导致混淆或危险。
建议将默认值更改为“upstream”,即仅推送当前分支,并将其推送到 git pull 将拉取的分支。另一个候选项是“current”,它只将当前分支推送到同名的远程分支。
目前已经讨论的内容可以在此线程中看到:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

之前的相关讨论包括:

要参与讨论,请将您的消息发送至:git@vger.kernel.org


Git 2.0 将更改 git push 的默认行为,但仅限于“简单”模式,我认为这不是您想要的。请参阅 https://www.kernel.org/pub/software/scm/git/docs/git-config.html。 - Alexander Bird
@AlexanderBird 是的,你说得对。我已经记录在这里了:https://dev59.com/e2kw5IYBdhLWcg3wSoks#10002469, https://dev59.com/ZmYr5IYBdhLWcg3wVY7K#13751847。 - VonC

1
以下操作可使第一次使用git push时无需指定-u ${branch_name}
git config "branch.${branch_name}.remote" origin
git config "branch.${branch_name}.merge" "refs/heads/${branch_name}"

当然,这样会更多地打字,但是在设置工作区的脚本中却不是这样。同时也不会过早地将分支推送到远程仓库。


1

使用-u选项进行git push

$ git push -u origin hp1:team/hp1

然后,之后你可以做:

$ git push

3
对我来说,它只是更改了 git pull 的配置,git push 的配置仍然是相同的(分支 hp1 没有设置推送目标)。 - m1schka
你能发布你的配置文件吗? - mipadi

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