193

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

4

8 回答 8

259

实际原因是,在一个新的仓库(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'。
在每种情况下,在初始之后git push -u origin master,一个简单的 git push 就足以继续将 master 推送到正确的上游分支。

于 2013-06-13T20:52:44.537 回答
115

没有,见下文

我觉得这个“功能”很烦人,因为我不是想向月球发射火箭,只是推动我该死的分支。你可能也会这样做,否则你就不会在这里!

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

git config --global push.default current

因此,如果您制作这样的分支:

git checkout -b my-new-branch

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

git push -u

把它们带到原点(在那个分支上),如果它不存在,它会为你创建所说的分支。

请注意,如果您稍后要从所述分支中拉出,请注意 -u 位确保它们已链接。如果您没有计划稍后拉分支(或者如果您这样做,可以使用另一个班轮) -u 是不必要的。

于 2015-08-13T22:22:01.443 回答
42

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 书籍的 Remote Branches 章节中阅读有关跟踪分支的更多信息。

于 2013-06-13T20:25:41.673 回答
4

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

不,不是每个分支都是你想推到外面世界的东西。它可能代表一个私人实验。

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

于 2013-06-13T20:39:44.167 回答
3

HEAD 是当前分支的缩写,因此 git push -u origin HEAD 有效。现在为了避免每次我使用别名时输入:

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

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

git pp

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

于 2017-09-29T06:34:32.077 回答
2

首先检查

Step-1: git remote -v
//如果找到 git initialize 然后删除或跳过 step-2

Step-2: git remote rm origin
//然后全局配置你的邮箱地址 git

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

第4步:git initial

Step-5: git commit -m "Initial Project"
//如果已经添加项目 repo 则跳过 step-6

第六步:git remote add origin %repo link from bitbucket.org%

第七步:git push -u origin master

于 2017-12-18T08:42:07.623 回答
1

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

我有一个名为的分支feat/XYZ-1234-some-description,因为我正在处理 Jira 问题 1234。在工作期间,我创建了一个新的 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
于 2019-11-04T16:27:04.753 回答
-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'.
于 2019-09-02T14:18:51.653 回答