git push,当它请求设置为上游时,当它
我不太清楚为什么git push,当它请求设置为上游时,当它,git,Git,我不太清楚为什么gitpush会为这些分支显示两条不同的消息。创建这两个分支(一个使用origin/master)和另一个不使用有什么区别 对于第一个:git checkout-b dev origin/master D:\Source\Projects\dev->origin\两周(dev->origin)(fortnight@1.0.0) git推送 致命的:你生命的上游分支 当前分支与当前分支的名称不匹配。到 推送到远程上的上游分支,使用 git推送原点头:主 要推送到远程服务器上同名的分
gitpush
会为这些分支显示两条不同的消息。创建这两个分支(一个使用origin/master
)和另一个不使用有什么区别
对于第一个:git checkout-b dev origin/master
D:\Source\Projects\dev->origin\两周(dev->origin)(fortnight@1.0.0)
git推送
致命的:你生命的上游分支
当前分支与当前分支的名称不匹配。到
推送到远程上的上游分支,使用
git推送原点头:主
要推送到远程服务器上同名的分支,请使用
git推送源开发
要永久选择任一选项,请参阅“git帮助”中的push.default
配置'
对于另一个:git checkout-b uat
D:\Source\Projects\uat->origin\fortuning(uat->origin)
git推送
致命:当前分支uat没有上游分支。推动
当前分支并将远程设置为上游,使用
git push --set-upstream origin uat
TL;博士
如果您的push.default
设置为simple
(或未设置并默认为simple
),则git push
将:
要求您的分支具有上游集。如果没有,您将收到消息致命:当前分支名称没有上游分支…
要求上游名称匹配减去远程
部分,即当前分支名称。也就是说,如果分支名为xyz
,则上游名称必须为origin/xyz
,前提是远程分支名为origin
因此,如果没有上游集,则得到错误#1;如果您有一个上游集合,但由于push.default
设置,它不是Git“喜欢”的集合,则会出现错误#2
在您使用的两种方法中,一种创建上游设置,另一种不创建。实际的上游设置是使push.default
发出抱怨的设置
长的
这里没有一个很好的简短答案,因为这种东西的历史最初被称为跟踪,现在被称为设置上游,而这种上游东西与多个不同Git命令中的每个命令交互的方式很长,坦率地说有点无聊。:-)不幸的是,为了理解现代(2.0或更新版本)Git的工作方式,您至少需要了解一点。这是因为Git的人一直在努力保持与Git1.5的兼容性,尽管实际上没有人使用Git1.5(甚至几乎没有人再使用Git1.7了,2.0之前的任何东西都是非常过时的)
在深入研究这些之前,请记住,git pull
实际上是两个git命令组合成一个。git pull
首先运行git fetch
。然后,在fetch工作之后,它运行第二个Git命令,通常是gitmerge
。单独讨论这些更好。push
的反面不是pull
,而是fetch
。这是由于一个历史性的错误,我们将看到
漫长而乏味的历史,尽可能地缩短
要从头开始并快速运行,问题的根源在于:最初的git pull
是一个非常简短的脚本:它运行git fetch
,然后运行git merge
,就是这样。获取和合并通常是您需要的底层操作,所以它就是这样做的。但是这个原始的git pull
命令是不够的,因为通常并不总是这样。脚本有时也会破坏您自己的存储库,如果出现问题或您在不好的时间运行它(我至少有一次遇到过这种情况)
剧本被修改了很多次,它变得更好了,尽管我被烧坏了,学会了避免它,最终从头开始重新编写。从git 2.6.0及更高版本开始,当前的git pull
,不再是shell脚本,可能不再破坏存储库(我自己仍然很少使用它。)与此同时,git-fetch
、git-push
、和git-status
都获得了新的特性,所有这些东西都纠缠不清
所有这些调整和重写的最终结果是,今天,您的主分支
、您的开发分支
、您创建和控制的任何其他分支都允许没有上游分支,或者只有一个上游分支。但是上游到底是什么?它有什么好处?为什么会收到这些不同的消息,一个抱怨上游名称不匹配,另一个抱怨没有上游?为什么这一切如此混乱和复杂?我们可以马上回答最后一个问题:它既混乱又复杂,因为在这些特性的发展过程中所犯的每一个错误都是被支持的,以防有人依赖它
定义分支名称的上游设置:序言
在Git内部,分支名称的上游非常简单,但它被定义为两部分。这两个部分是一个我们尚未定义的遥控器,然后是一个在遥控器上有意义的名称。因此,在定义上游之前,我们必须定义远程
定义远程和相应的远程跟踪名称
当你第一次运行git clone时,你必须给它一个URL。在过去糟糕的日子里,每次都要给Git一个URL,一遍又一遍。显然,重复输入同一个URL是愚蠢的。我们有一台电脑,为什么不让它记住网址呢
这是遥控器的主要工作。遥控器只是一个简短、易于键入的字符串,如origin
。这会记住一个URL:您现在可以git获取原点
或git推送原点
,并且
[remote "origin"]
url = ...
remote.origin.url=...
git ls-remote origin
3034dab9ed6b11970a53099a7b3ca981f1461365 HEAD
98e06ded345450b3b07099d3ed1abf58fc95f5b6 refs/heads/maint
3034dab9ed6b11970a53099a7b3ca981f1461365 refs/heads/master
0f2c4a37fdba75d06ae7254c4b30ed7739985214 refs/heads/next
[snip]
213030c8af8ad9f9060cc264395817adb4ede44e refs/tags/v2.2.3
441c4a40173fe1ee8a5c0094e587dfc47e2a6460 refs/tags/v2.2.3^{}
90141c859541f8daa08bdb0621c64cbd7dadbd8c refs/tags/v2.20.0
5d826e972970a784bd7a7bdf587512510097b8c7 refs/tags/v2.20.0^{}
[snip]
git clone -o boo <url>
$ git config --local --list
[snip]
branch.master.remote=origin
branch.master.merge=refs/heads/master
[snip]
branch.zorg.remote=.
branch.zorg.merge=refs/heads/master
$ git branch -vv
* master 9c9b961d7e [origin/master] The sixth batch
[snip]
$ git rev-parse --symbolic-full-name master@{upstream}
refs/remotes/origin/master
git pull <url> <branch>
git pull <remote> <branch>
git pull
[origin/master: ahead 1, behind 10]
Your branch and 'origin/master' have diverged,
and have 1 and 10 different commits each, respectively.
git checkout -b foo
git branch foo
git checkout -b foo origin/master
git branch foo origin/master
git checkout -b foo master
git checkout feature/short
git checkout -b feature/short --track origin/feature/short
git branch name start-point-name
git checkout -b dev
git branch --set-upstream-to origin/dev
$ git checkout -b dev
Switched to a new branch 'dev'
$ git branch --set-upstream-to origin/dev
error: the requested upstream branch 'origin/dev' does not exist
hint:
[snip]
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
git push origin dev
git branch --set-upstream-to origin/dev
git push -u origin dev