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