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

内核.org为了git push:

-u

–设置上游

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

这是branch.<name>.mergegit config:

branch.<name>.merge

定义,连同branch.<name>.remote,给定分支的上游分支。<name>,它告诉 git fetch 默认的 refspec 被标记为在 FETCH_HEAD 中合并。"branch.<name>.remote"<name>从本地存储库中的另一个分支,您可以指向branch.<name>.merge到所需的分支,并使用特殊设置。 branch.<name>.remote

我成功地使用 github 设置了一个远程存储库,并成功地将我的第一次提交推送到它:

git push -u origin master

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

git commit -m '[...]'

然而,错误地认为我必须再次推动originmaster,我跑了:

# note: no -u
git push origin master

那是做什么的?git push -u origin master

答案

关键是"无参数 git-pull"。git pull从分支,不指定源远程或分支,git 会查看branch.<name>.merge设置知道从哪里拉。git push -u为您要推送的分支设置此信息。

要查看差异,让我们使用一个新的空分支:

$ git checkout -b test

首先,我们推无-u:

$ 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无需指定远程或分支即可按预期工作。

**Update:**奖金提示:

  • 正如马克在评论中提到的,除了git pull此设置也会影响默认行为git push-u要捕获您想要跟踪的远程分支,我建议设置您的push.default配置值到upstream
  • git push -u <remote> HEAD将当前分支推送到同名分支<remote>(并且还设置跟踪,以便您可以执行以下操作git push在那之后)。

来自: stackoverflow.com