为什么需要显式推送新分支?


180

我是新手,git正在练习。我创建了一个本地分支,但我发现当我这样做时,git push我的分支没有上载到存储库。我实际上必须这样做:git push -u origin --all
为什么是这样?分支不是默认情况下要推送的新更改吗?为什么需要运行第二个命令?


15
请注意,这是可配置的(设置push.default,请参见man git-config)。如果这样做git config --add push.default current,则git push如有必要,它将在远程仓库中自动创建分支。答案中说明了为什么这不是默认值。
sleske

@sleske,我同意。有关其他策略“ current”和“ upstream”,请参阅我的旧答案stackoverflow.com/a/13751847/6309
VonC

为什么不接受答案?
laike9m 2014年

Answers:


224

实际原因是,在新的仓库(git init)中,没有分支(没有master,根本没有分支,零分支)

因此,当您第一次推送到一个空的 上游仓库(通常是一个裸仓库)时,该上游仓库没有相同名称的分支。

和:

在这两种情况下,由于上游空仓库没有分支:

  • 尚无匹配的命名分支
  • 根本没有上游分支(具有或不具有相同名称!是否跟踪)

这意味着当地的第一推不知道:

  • 在哪里推
  • 推送内容(因为它找不到任何上游分支被记录为远程跟踪分支和/或具有相同名称)

因此,您至少需要执行以下操作:

git push origin master

但是,如果您仅这样做,则:

  • master在上游(现在是非空仓库)上创建一个上游分支:好。
  • 不会记录本地分支' master'需要推送到上游(origin)' master'(上游分支):不好。

这就是为什么建议第一次进行以下操作的原因:

git push -u origin master

这将记录origin/master远程跟踪分支,并使下一次推送能够自动推master送到origin/master

git checkout master
git push

这也适用于推送策略“ current”或“ upstream”。
在每种情况下,在执行initial之后git push -u origin master,简单的git push就足以继续将master推入正确的上游分支。


2
在这一点之后,下一个git push还期望分支已经存在吗?
Cratylus

2
是。它将对该分支的所有更新推送到上游存储库。
RyPeck

@Cratylus是的,因为新的默认推送策略' simple':推送到任何记录的上游分支,如果该上游分支与本地分支具有相同的名称。一个简单git push就足够了。
VonC

1
@ButtleButkus谢谢。我已经恢复了链接。
VonC

3
对于发问者更常见的新分支'new_branch'的情况,您可以使用git push --set-upstream origin new_branchgit push -u origin new_branch简称。在-all该提问用过绕过通过包括所有分支命名一个特定的新的分支。+ Klas Mellbourn在他的回答中对此进行了介绍。
Paul Masri-Stone

106

你不知道,见下文

我发现这个“功能”相当烦人,因为我没有试图将火箭发射到月球上,只需推动我该死的分支。您可能也会这样做,否则您将不会在这里!

解决方法是:如果您希望它隐式地推送当前分支,而不管该分支是否存在于原始位置,只需发出此命令一次,而您再也不必在任何地方重复该命令:

git config --global push.default current

因此,如果您这样创建分支:

git checkout -b my-new-branch

然后进行一些提交,然后执行

git push -u

使它们起源(在该分支上),如果不存在,它将为您创建该分支。

请注意,如果您稍后要从所述分支中拉出-u位,请确保它们已链接。如果您没有以后再拉分支的计划(或者如果有的话,也可以用另一个衬里)-u是没有必要的。


3
当我这样做时,如果执行git pull,则紧接之后-两个分支不会链接。:(
Alisso '16

这是解决我的问题的唯一答案。
雷蒙德·谢农

2
要链接它们,请使用git push -u
Ben Creasy

谢谢!此答案应被视为快速且“肮脏”的解决方案。我很确定它与OP的意图最接近。
youngrrrr

3
>我不是要向月球发射火箭。-是的
VCavallo

39

git push推送新分支时的输出

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

简单地git push假设当前本地分支正在跟踪的远程分支已经存在。如果不存在这样的远程分支,并且要创建它,则必须使用-u(的缩写形式--set-upstream)标志来指定。

为什么会这样呢?我猜想实施者会觉得在远程上创建一个分支是一项重大工作,以至于很难错误地做到这一点。git push是你一直在做的事情。

“默认情况下,分支不是要推送的新更改吗?” 我会说,Git中的“更改”是一个承诺。分支是指向提交的指针。对我而言,将推送视为将推送提交到其他存储库的想法更有意义。推送哪些提交取决于您所在的分支以及该分支与远程分支的跟踪关系。

您可以在Pro Git手册的“ 远程分支”一章中了解有关跟踪分支的更多信息。


我没有得到a fatal但我已经在分支中完成了提交。
Cratylus

@Cratylus不,没关系。提交在您的存储库中是安全的,并将其git push -u origin复制到远程存储库中。
Klas Mellbourn

不,我的意思是我没有得到fatal您在答案中提到的消息的消息,这种区别是否取决于我向分支机构提交了一些东西的事实?
Cratylus

@Cratylus我不知道为什么你没有收到fatal消息。我猜想差异取决于您所使用的git实现。我的输出是从1.8.1.msysgit.1运行在Windows 8
克拉斯Mellbourn

我有相同的版本,但在Vista上
Cratylus

4

我无法很快找到原始开发人员的理论依据,但是我可以根据几年的Git经验为您提供有根据的猜测。

不,并非每个分支都是您想要推向外界的东西。它可能代表一个私人实验。

此外,应该git push将所有分支机构发送到哪里?Git可以与多个遥控器一起使用,并且您可能希望在每个遥控器上具有不同的分支集。例如,一个中央项目GitHub存储库可能有发行分支;GitHub分支可能具有主题分支供审核;并且本地Git服务器可能具有包含本地配置的分支。如果git push将所有分支推送到当前分支跟踪的远程站点,则这种方案很容易搞砸。


1)。It might represent a private experiment好,但是有什么大不了的?每个人都在工作的“主要”分支master不会受到影响。除非您不打算隐藏源代码,否则2)git push, without a remote, pushes to the current branch's remote我在这里让您迷失了:(
Cratylus 2013年

@Cratylus:1)在一个拥有数十个开发人员的项目中,所有开发人员都分支了ad lib,您将获得非常混乱的存储库。我从事这样的项目,我不想git fetch每次都去数百个半工作的分支机构。2)我指git push的是的默认行为。如果存在,它将推送到当前分支正在跟踪的远程。
Fred Foo 2013年

3

HEAD是当前分支的缩写,因此git push -u origin HEAD可以工作。现在,为了避免每次我使用别名时进行此键入:

git config --global alias.pp'推-u origin HEAD'

之后,每次我想推送通过git -b分支创建的分支时,都可以使用以下命令推送它:

git pp

希望这可以为某人节省时间!


2

首先检查

步骤1:git remote -v
//如果找到git initialize,则删除或跳过步骤2

步骤2:git remote rm origin
//然后在全局配置您的电子邮件地址git

步骤3: git config --global user.email "youremail@example.com"

第4步: git initial

步骤5:git commit -m "Initial Project"
//如果已经添加了项目仓库,则跳过步骤6

步骤6: git remote add origin %repo link from bitbucket.org%

步骤7: git push -u origin master


1

我刚刚经历了这个问题的进一步排列。

我有一个分支的名称feat/XYZ-1234-some-description是因为我正在研究1234年的Jira问题。在工作中,我创建了一个新的Jira问题来跟踪较小的工作,当我来推动时,我决定使用这个新的问题编号来推到分支名称在:

git push -u origin feat/XYZ-5678-a-different-description # failed

这给了我这个SO线程中正在讨论的错误。但是,由于我尝试使用与当前分支不同的分支名称,因此我的问题与此处描述的问题不同。我最终重命名了本地分支,然后才可以推送它:

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

经过一番阅读之后,我意识到我可以src在上将 a设置为git push当前分支名称,或者HEAD适当时设置为:

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

如果您启用了第一次从新分支推送新更改。并出现以下错误:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

要推送当前分支并将远程设置为上游,请使用

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.