我是新来的江户人,我在练习。我创建了一个本地分支,但我发现当我创建git push时,我的分支没有上传到存储库。我不得不这么做:江户十一〔二〕。这是为什么?默认情况下,分支不是要推送的新更改吗?为什么需要运行第二个命令?
- 注意这是可配置的(设置push.default,见man git-config)。如果您执行git config --add push.default current,那么git push将根据需要自动在远程回购中创建分支。答案中解释了为什么这不是默认值。
- @我同意。有关其他政策"current"和"upstream",请参阅我以前的答案stackoverflow.com/a/13751847/6309。
- 为什么不接受答案?
实际原因是,在新回购(git init)中,没有分支(没有master,根本没有分支,没有分支)
因此,当您第一次推动空的上游回购(通常是空的)时,上游回购没有同名的分支。
还有:
- 默认的推送策略是"matching"(推送同名的所有分支,如果它们不存在则创建它们)。
- 默认的推送策略现在是"simple"(仅推送当前分支,并且仅当它在上游具有类似名称的远程跟踪分支时,从Git 1.7.11开始)
在这两种情况下,由于上游空回购没有分支:
- 还没有匹配的命名分支
- 没有上游分支(有或没有相同的名称!是否跟踪)
这意味着你的本地首次推送不知道:
- 往哪儿推
- 推什么(因为它找不到任何上游分支记录为远程跟踪分支和/或具有相同名称)
所以你至少需要做一个:
号
但如果你只这样做,你:
- 将在上游(现在非空回购)创建一个上游master分支:好。
- 不会记录本地分支机构"EDOCX1"(7)需要推到上游(EDOCX1)(12))"EDOCX1"(7)(上游分支机构):坏。
因此,建议在第一次推送时执行以下操作:
1
| git push -u origin master |
这将把origin/master记录为远程跟踪分支,并使下一次推送能够自动将master推送到origin/master。
1 2
| git checkout master
git push |
。
这也适用于"EDOCX1"(17)或"EDOCX1"(18)。在每种情况下,在最初的git push -u origin master之后,一个简单的git push将足以继续将master推到右上游分支。
- 在这之后,下一个git push也期望分支已经存在?
- 对。它会将该分支的任何更新推送到上游存储库。
- @克拉底鲁是的,因为新的默认推送政策"EDOCX1"(22):如果上游分支与本地分支同名,则推送任何记录的上游分支。一个简单的git push就足够了。
- 假设我第一次使用git push origin master,那么接下来如何将origin/master标记为远程跟踪分支?当远程分支已经存在并且已经被推到以前的位置时,我还可以使用git push -u origin master吗?
- 如何记住这个解决方案:只需在失败的git push之后遵循有帮助的git输出。提出了git push --set-upstream origin master,这是git push -u origin master的长版本。
- 这帮了我很大的忙
- 与"裸"回购概念的链接断开。
- @谢谢你。我已经恢复了链接。
- @VONC链接似乎说它不适用于v1.7以上的Git。使用Git2.3的非裸回购可以吗?
- @Buttlebutkus Git 2.3实际上还可以:请参阅stackoverflow.com/a/28381311/6309
- 对于发问者更一般的新分支"新分支",您可以使用git push --set-upstream origin new_branch或git push -u origin new_branch。提问者使用的-all通过包括所有分支来绕过命名一个特定的新分支。这一点在他的回答中被+克拉斯梅尔伯恩所覆盖。
你没有,看下面
我觉得这个"特性"很烦人,因为我不想把火箭发射到月球上,只要推我该死的树枝就行了。你可能也是,否则你就不会在这里了!
修复方法如下:如果您希望它隐式地推送当前分支,而不管分支是否存在于源站上,只需发出此命令一次,就不必再在任何地方执行此命令:
1
| git config --global push.default current |
所以如果你做这样的树枝:
1
| git checkout -b my-new-branch |
号
然后做出一些承诺然后做一个
把它们带到原点(在那个分支上),如果它不存在,它会为您创建所说的分支。
注意-u位确保它们是链接的,如果您稍后要从所说的分支上拉。如果你以后不打算拉分支(或者如果你愿意的话可以用另一个一行的话),你就不需要了。
- 当我这样做的时候,如果我做了一个git-pull,紧接着-两个分支没有链接。:(
- 这是唯一解决我问题的答案。
- 要链接它们,请使用git push -u。
- 谢谢!这个答案应该被认为是快速而"肮脏"的解决方案。我很确定这是最接近行动意图的。
- >我不想把火箭发射到月球上。--是的。
推新分支时git push的输出
1 2 3 4 5 6 7
| > 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手册的"远程分支"一章中了解有关跟踪分支的更多信息。
- 我没有得到一个fatal,但我已经在分支机构中做了一个承诺。这有关系吗?
- @克拉底鲁不重要。提交在您的存储库中是安全的,并且git push -u origin将其复制到远程存储库中。
- 不,我的意思是我没有收到像你在回答中提到的那样的fatalmsg。这种差异是否取决于我向分支机构承诺了什么?
- @克拉底鲁,我不知道你为什么没有收到埃多克斯的消息。我想差异完全取决于您使用的Git实现。我的输出来自运行在Windows8上的1.8.1.msysgit.1。
- 我有相同的版本,但在Vista上
- @克拉底鲁,即使我作出承诺,我也会收到埃多克斯的信息。
- 如果我是checkout -b name并提交文件,我的HEAD在name中。如果我是git push中,我得到:warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use: etc然后是Everything up-to-date。
- @克拉底鲁你可以通过执行git config --global push.default simple来避免这个信息。你得到Everything up-to-date的原因一定是远程服务器上已经有一个name分支,现在由你的本地name分支跟踪。
- 好啊。但为什么不是fatal?
- 让我们在聊天中继续讨论
我不能很快找到原始开发人员的理由,但是我可以根据几年的Git经验给你一个有教育意义的猜测。
不,不是每一个分支都是你想向外界推销的东西。它可能代表一个私人实验。
此外,git push应该把所有的分支机构都送到哪里?Git可以使用多个远程设备,您可能希望在每个远程设备上有不同的分支集。例如,中央项目Github repo可能有发布分支;Github fork可能有主题分支供审阅;本地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:1)在一个有几十个开发人员的项目中,他们都是ad lib分支,你会得到非常混乱的repo。我从事这样的项目,我不希望每次都有成百上千的工作分支。2)我指的是git push的违约行为。它将当前分支跟踪的位置推到远程(如果有)。
第一次检查时
步骤一:git remote -v。//如果找到Git初始化,则删除或跳过步骤2
第二步:git remote rm origin。//然后全局配置电子邮件地址git
步骤3:git config --global user.email"[email protected]"。
步骤4:git initial。
步骤5:git commit -m"Initial Project"。//如果已经添加了项目repo,则跳过步骤6
步骤6:git remote add origin %repo link from bitbucket.org%。
步骤7:git push -u origin master。
头是当前分支的缩写,所以git push-u origin head工作。现在,为了避免每次使用别名时都输入以下内容:
git config--global alias.pp"push-u origin head"
此后,每当我想推送通过Git-B分支创建的分支时,我都可以使用以下方法推送它:
GIT聚丙烯
希望这能为别人节省时间!