将git push推送到远程仓库时,如何推送非当前分支?

40

在git的bare仓库中,是否有一种方法可以推送当前不在HEAD中的分支?

例如,我有两个分支:

$ git branch
* master
  another

我有两个已设置的远程分支: originanother

我需要能够在不改变HEAD的情况下,只用一个命令从another推送到another/another


2
你可能考虑远程和分支不要使用完全相同的名称,这会令人困惑。 - Klas Mellbourn
3
你可以使用 git branch -m another another_branch 或者 git remote rename another another_remote - Klas Mellbourn
2
@KlasMellbourn,那只是为了举例而已。当然我没有这种奇怪的命名。 - Alexey Kamenskiy
3个回答

46

原问题、回答和许多评论中的所有“另一个另一个”都很令人困惑(这正是为什么在一开始就正确命名你的东西非常重要的完美例子),我不禁要写下另一个回答,如下所示。

问:在git(裸)仓库中是否有一种方法可以推送当前不在HEAD中的分支?例如,我有两个分支和两个远程分支。 我需要能够通过一个命令从 feature 推送到 upstream/feature,而不改变HEAD。

$ git branch
* master
  feature
$ git remote
origin
upstream

A: 执行 git push remote_name branch_name 命令。在上面的例子中,命令应该长成这样。

$ git push upstream feature

问:这是不是意味着它将把本地的feature推送到upstream/feature?我一直以为它会把当前HEAD推送到upstream/feature

答:是的。 feature 部分是一个 refspec ,格式为 src:dst。 这意味着将本地分支 src 推送到远程分支 dst。 如果省略了 :dst,则将本地分支 src 推送到远程分支 src。 您还可以指定不同的名称作为远程分支。只需执行:

$ git push upstream feature:cool_new_feature

(感谢 @gabriele-petronella 和 @alexkey 提供本答案的材料。)


1
请注意,“upstream”只是特定远程的别名。如果您一直遵循最典型的在线惯例(即大量复制粘贴),那么它实际上将是“origin”。参见:https://dev59.com/SGkw5IYBdhLWcg3w9_Qi - Kat
1
@Kat:虽然upstreamorigin都只是特定远程的别名,但它们在GitHub分支工作流程的惯例下具有不同的含义。除非你知道自己在做什么,否则不要假设你可以在任何git命令中随意替换upstreamorigin - RayLuo

37

使用 git push 命令,您可以指定远程仓库和本地分支。

git push remotename branchname

6
是的,(第二个)another是一个refspec,通常具有src:dst格式。这意味着将本地分支src推送到远程分支dst。如果省略:dst,则会将本地分支src推送到远程分支src - Lars Noschinski
1
当前的 HEAD 只是默认值,但你可以像 Lars 指出的那样指定任何分支(或更一般地说,任何 refspec)。 - Gabriele Petronella
3
事实上,git push another anothergit push another another:another完全等效。虽然我感觉我不能再忍受另一个"another"了。 - Gabriele Petronella
2
对我没用,但那是因为 Git 是由讨厌文档的人编写的。 - cbmanica
1
我发现这个解释有误导性。在 git 2.14.1 中,我不得不执行 git push origin mybranch:mybranch - Mike Funk
显示剩余4条评论

-1

当我尝试使用--set-upstream (-u)推送a到远程新分支时

git push MyLocalBranch -u origin MyLocalBranch

我没有检出分支,所以收到了错误信息。

fatal: 'MyLocalBranch' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

感谢评论git push NOT current branch to remote

是的。另一个是refspec,通常具有src:dst形式。这意味着将本地分支src推送到远程分支dst。如果省略:dst,则将本地分支src推送到远程分支src。

Lars Noschinski得知解决方案是调用

git push -u origin MyLocalBranch:MyLocalBranch

1
与问题无关,也不需要,因为问题已经得到了完整和正确的回答。这更像是个人成功的日记或自传。 - matt
你说得对,马特。但是我的意图是帮助其他像我一样偶然发现这个答案的人。应该创建一个新问题并回答它。 - Tim

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