“u"做什么?git push -u origin master;git push origin master"

我显然不擅长使用git,尽管我尽了最大努力去理解它。

kernel.orggit push:

- u

——set-upstream

对于每个最新的或成功推送的分支,添加upstream(跟踪)引用,由无参数的git-pull(1)和其他命令使用。更多信息,请参见git-config(1)中的branch.<name>.merge

下面是来自git configbranch.<name>.merge:

branch.<name>.merge

branch.<name>.remote一起定义给定分支的上游分支。它告诉git fetch/git pull要合并哪个分支,也可以影响git push(参见push.default)。在分支<name>中,它告诉git获取默认的refspec,标记为在FETCH_HEAD中合并。该值像refspec的远端部分一样处理,并且必须匹配从"branch.<name>.remote"给出的远端获取的ref。merge信息被git pull(它首先调用git fetch)用来查找用于合并的默认分支。如果没有这个选项,git将默认合并获取的第一个refspec。指定多个值以获得章鱼合并。如果你希望设置git pull,以便它从本地存储库中的另一个分支合并到<name>,你可以将branch.<name>.merge指向所需的分支,并使用特殊设置。(句点)用于branch.<name>.remote

我成功地用github建立了一个远程存储库,我成功地将我的第一次提交到它:

git push -u origin master

然后,我无意中成功地将我的第二次提交推到我的远程存储库,使用:

git commit -m '[...]'

然而,错误地认为我必须再次从master推到origin,我运行:

# note: no -u
git push origin master

这有什么用?这似乎根本没有任何效果。我是否“撤销”了git push -u origin master?

249045 次浏览

关键是“无争议的拉”。当你从一个分支执行git pull,而没有指定源远程或分支时,git会查看branch.<name>.merge设置以知道从哪里提取。git push -u为你正在推的分支设置这个信息。

为了看到区别,让我们使用一个新的空分支:

$ git checkout -b test

首先,我们在没有-u的情况下进行push:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.


If you often merge with the same branch, you may want to
use something like the following in your configuration file:


[branch "test"]
remote = <nickname>
merge = <remote-ref>


[remote "<nickname>"]
url = <url>
fetch = <refspec>


See git-config(1) for details.

现在,如果我们添加-u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

注意,跟踪信息已经设置,因此git pull可以正常工作,而无需指定远程或分支。

额外提示:

  • 正如Mark在评论中提到的,除了git pull,这个设置还会影响git push的默认行为。如果你习惯使用-u来捕获你想要跟踪的远程分支,我建议将你的push.default配置值设置为upstream
  • git push -u <remote> HEAD将当前分支推到<remote>上同名的分支(同时设置跟踪,这样你就可以在那之后执行git push)。
git push -u origin master

等于:

git push origin master ; git branch --set-upstream master origin/master

如果你忘记-u!

你可以强制它:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

如果你让命令为你做这件事,它会挑出你的错误,比如如果你输入了一个不存在的分支或者你没有git remote add;虽然这可能是你想要的。:)

简单来说:

从技术上讲,-u标志为你要推入的上游服务器添加跟踪引用。

这里重要的是,这可以让你在不提供任何参数的情况下执行git pull。例如,一旦你执行了git push -u origin master,你就可以稍后调用git pull, git就会知道你实际上指的是git pull origin master

否则,您必须输入整个命令。