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

时间:2013-06-13 20:21:32

标签: git version-control

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

8 个答案:

答案 0 :(得分:198)

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

因此,当您第一次推送 upstream repo(通常为bare one)时,该上游回购没有相同名称的分支。

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

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

这意味着您的本地第一次推送不知道:

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

所以你至少需要做一个:

git push origin master

但如果你只做那件事,你:

  • 将在上游(现在为非空仓库)创建上游master分支:good。
  • 不会记录本地分支“master”需要推送到上游(origin)“master”(上游分支):坏。

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

git push -u origin master

这会将origin/master记录为remote tracking branch,并会启用下一次推送以自动将master推送到origin/master

git checkout master
git push

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

答案 1 :(得分:99)

您没有,请参阅下文

我发现这个“功能”相当令人讨厌,因为我不是想向月球发射火箭,只是推开我该死的树枝。你可能也这样做,否则你不会在这里!

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

git config --global push.default current

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

git checkout -b my-new-branch

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

git push -u

将它们发送到原点(在该分支上),如果它不存在,它将为您创建所述分支。

注意-u位确保它们是链接的,如果你以后从所述分支拉。如果你以后没有计划拉分支(或者你可以选择其他一个班轮) - 没有必要.-

答案 2 :(得分:34)

推送新分支时输出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中的“改变”是一个提交。分支是指向提交的指针。对我来说,将推送视为将提交推送到其他存储库的东西更有意义。推送哪些提交取决于您所在的分支以及该分支与远程分支的跟踪关系。

您可以在Remote Branches chapter of the Pro Git book中了解有关跟踪分支的更多信息。

答案 3 :(得分:4)

我很快就找不到原始开发人员的理由,但我可以根据几年的Git经验给你一个有根据的猜测。

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

此外,git push应该在哪里发送所有分支? Git可以使用多个遥控器,你可能希望每个都有不同的分支。例如。一个中心项目GitHub repo可能有发布分支; GitHub fork可能有主题分支供审阅;并且本地Git服务器可能具有包含本地配置的分支。如果git push将所有分支推送到当前分支跟踪的远程,那么这种方案很容易搞砸。

答案 4 :(得分:2)

HEAD是当前分支的缩写,因此git push -u origin HEAD可以工作。现在每次使用别名时都要避免这种输入:

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

在此之后,每当我想通过git -b分支创建分支时,我都可以使用它来推送它:

git pp

希望这为某人节省时间!

答案 5 :(得分: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

答案 6 :(得分:1)

我刚刚对此问题进行了进一步的排列。

我有一个名为feat/XYZ-1234-some-description的分支,因为我正在研究1234年的《吉拉》问题。在工作中,我创建了一个新的《吉拉》问题来跟踪较小的工作,当我推动时,我决定将其推送具有以下新发行编号的分支机构名称:

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

经过一番阅读之后,我意识到我可以在{{1} src,或者是当前的分支名称,或者在合适的情况下仅使用git push

HEAD

答案 7 :(得分:-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'.