为什么我需要明确推送新分支?

Cra*_*lus 169 git version-control

我是新手git,我在练习.我创建了一个本地分支,但是当我完成时,我看到git push我的分支没有上传到存储库.我必须这样做:git push -u origin --all.
为什么是这样?不是分支是默认推送的新变化吗?为什么我需要运行第二个命令?

Von*_*onC 208

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

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

和:

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

  • 还没有匹配的命名分支
  • 根本没有上游分支(有或没有相同的名称!跟踪与否)

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

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

所以你至少需要做一个:

git push origin master
Run Code Online (Sandbox Code Playgroud)

但如果你这样做,你:

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

这就是为什么建议第一次推动:

git push -u origin master
Run Code Online (Sandbox Code Playgroud)

这将记录origin/master作为一个远程跟踪分支,并且将启用下一个推自动推masterorigin/master.

git checkout master
git push
Run Code Online (Sandbox Code Playgroud)

这也适用于推送政策' current'或' upstream'.
在每种情况下,在初始之后git push -u origin master,一个简单的git push就足以继续将master推送到右上游分支.

  • 对于提问者更常见的新分支'new_branch'的情况,你可以使用`git push --set-upstream origin new_branch`或`git push -u origin new_branch`.提问者使用的`-all`通过包括所有分支来命名一个特定的新分支.+ Klas Mellbourn在答案中对此进行了介绍. (3认同)
  • 在这一点之后,下一个`git push`也期望分支已经存在? (2认同)
  • 是.它会将该分支的任何更新推送到上游存储库. (2认同)

Joh*_*ner 105

你没有,见下文

我发现这个"功能"相当令人讨厌,因为我不是想把火箭发射到月球,只是推着我该死的树枝.你可能也这样做,否则你就不会在这里!

以下是修复:如果您希望它隐式推送当前分支,无论该分支是否存在于原点,只需发出一次此命令,您将永远不会再在任何地方:

git config --global push.default current
Run Code Online (Sandbox Code Playgroud)

所以如果你做这样的分支:

git checkout -b my-new-branch
Run Code Online (Sandbox Code Playgroud)

然后做一些提交,然后做一个

git push -u
Run Code Online (Sandbox Code Playgroud)

将它们带到原点(在该分支上),如果它不存在,它将为你创建所述分支.

注意-u位确保它们是链接的,如果你稍后从所述分支拉.如果你以后没有计划拉分支(如果你这样做,可以使用另一个衬管) - -u是没有必要的.

  • 当我这样做时,如果我做了一个git pull,紧接着 - 两个分支没有链接.:( (3认同)
  • >我不是要向月球发射火箭。-是的 (3认同)
  • 要链接它们,使用`git push -u` (2认同)

Kla*_*urn 38

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
Run Code Online (Sandbox Code Playgroud)

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

为什么会这样?我想实施者认为在遥控器上创建一个分支是一个非常重要的行动,它应该很难做到这一点.git push是你一直在做的事情.

"默认情况下,推出的新分支不是新的变化吗?" 我会说Git中的"改变"是一个提交.分支是指向提交的指针.对我来说,将推送视为将提交推送到其他存储库的东西更有意义.推送哪些提交取决于您所在的分支以及该分支与远程分支的跟踪关系.

您可以在Pro Git书的" 远程分支"一章中阅读有关跟踪分支的更多信息.