为什么我需要明确推新的分支?
我是新手,我正在练习。 我创build了一个本地分支,但我看到,当我做了git push
我的分支没有上传到存储库。 我不得不实际做的: git push -u origin --all
。
为什么是这样? 是不是一个分支默认推动新的变化? 为什么我需要运行第二个命令?
实际的原因是,在一个新的回购(git init)中, 没有分支 (没有master
分支,根本没有分支,零分支)
所以当你第一次推到一个空的 上游仓库 (通常是空仓 仓库 )时,那个上游仓库没有同名的仓库。
和:
- 默认推送策略是“
matching
” (推送所有相同名称的分支,如果它们不存在则创build它们), - 默认推送策略现在是'
simple
' (只推送当前分支,并且只有在上游有一个类似命名的远程跟踪分支 , 因为git 1.7.11 )
在这两种情况下,由于上游空回购没有分支:
- 还没有匹配的命名分支
- 根本没有上游分支(有或没有相同的名字!跟踪与否)
这意味着你的本地第一推动不知道:
- 在哪里推
- (因为找不到任何上游分支被logging为远程追踪分支,和/或具有相同的名称)
所以你至less需要做一个:
git push origin master
但是,如果你只有这样做,你:
- 将在上游(现在非空回购)创build一个上游
master
分支:好的。 - 不会logging当地分行的“
master
”需要被推到上游(origin
)“master
”(上游分行):不好。
这就是为什么build议首先要做一个:
git push -u origin master
这将loggingorigin/master
作为一个远程追踪分支 ,并将启用下一个推动自动推动master
origin/master
。
git checkout master git push
而且这也将推动政策“ current
”或“ upstream
”。
在每种情况下,在初始的git push -u origin master
,一个简单的git push将足以继续将主控推向右上游分支。
你不要,看下面
我觉得这个“function”比较烦人,因为我不是试图向月球发射火箭,只是把我该死的分支推开。 你可能也做了,否则你不会在这里!
这里是解决方法:如果你希望它隐式推送当前分支,不pipe该分支是否存在于原始位置,只需发出一次这个命令,而不再需要任何地方:
git config --global push.default current
所以如果你做这样的分支:
git checkout -b my-new-branch
然后做一些提交,然后做一个
git push
让它们出来(在那个分支上),如果它不存在,它会为你创build分支
推新分支时输出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
假定已经存在一个当前本地分支正在跟踪的远程分支。 如果不存在这样的远程分支,并且想要创build它,则必须使用-u
(– --set-upstream
简写forms)标志来指定。
为什么这样呢? 我猜实施者觉得在遥控器上创build一个分支是一个很重要的行动,应该很难做到这一点。 git push
是你一直在做的事情。
“不是一个分支是一个默认推动的新变化吗?” 我会说Git中的“改变”是一个提交。 分支是一个提交的指针。 对我来说,将推送视为将提交推送到其他存储库更有意义。 推送哪个提交由您所在的分支以及该分支到远程分支的跟踪关系决定。
您可以阅读Pro Git书籍的“ 远程分支”章节中有关跟踪分支的更多信息。
我很快就找不到原始开发者的理由,但是我可以根据几年的Git经验给你一个有根据的猜测。
不,不是每个分支都是你想要推向外部世界的东西。 这可能是一个私人实验。
而且, git push
应该把所有的分支发送到哪里呢? Git可以与多个遥控器一起使用,并且您可能希望每个遥控器都有不同的分支。 例如,一个中央项目GitHub回购可能有发布分支机构; GitHub分支可能有主题分支进行审查; 而本地Git服务器可能有包含本地configuration的分支。 如果git push
将所有分支推送到当前分支跟踪的远程,这种scheme很容易搞砸。
HEAD是当前分支的简称,所以git push -u origin HEAD工作。 现在为了避免这种打字,我每次使用别名:
git config –global alias.pp'push -u origin HEAD'
在这之后,我每次想推通过git -b分支创build的分支,我可以推它使用:
git pp
希望这可以节省一些时间!