"你"究竟做了什么?"git push -u origin master"vs"git push origin master"

Clo*_*boy 298 git

尽管我最好去理解它,但我使用git显然很糟糕.

kernel.orggit push:

-u

--set上游

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

这是branch.<name>.merge来自git config:

branch.<name>.merge

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

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

git push -u origin master
Run Code Online (Sandbox Code Playgroud)

然后,我在不知不觉中成功地将我的第二次提交推送到我的远程存储库:

git commit -m '[...]'
Run Code Online (Sandbox Code Playgroud)

然而,错误地以为我将不得不再次推到originmaster,我跑:

# note: no -u
git push origin master
Run Code Online (Sandbox Code Playgroud)

那是做什么的?它似乎没有任何影响.我"撤消"了git push -u origin master吗?

dah*_*byk 303

关键是"无争议的git-pull".当您git pull从分支执行a ,而不指定源远程或分支时,git会查看该branch.<name>.merge设置以了解从哪里提取.git push -u为您正在推送的分支设置此信息.

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

$ git checkout -b test
Run Code Online (Sandbox Code Playgroud)

首先,我们推动没有-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.
Run Code Online (Sandbox Code Playgroud)

现在,如果我们添加-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.
Run Code Online (Sandbox Code Playgroud)

请注意,已设置跟踪信息,以便在git pull不指定远程或分支的情况下按预期工作.

更新:奖金提示:

  • 正如Mark在评论中提到的那样,除此git pull设置外还会影响默认行为git push.如果您习惯使用-u捕获要跟踪的远程分支,我建议您将push.default配置值设置为upstream.
  • git push -u <remote> HEAD将当前分支推送到同名的分支<remote>(并设置跟踪,以便您可以在此git push之后执行).

  • @dahlbyk:你的答案很好,但在你上面的评论中你重复一个[常见的误解](http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git -push /)关于`git push` - 除非你自己设置`push.default`,`git push`只使用上游分支配置决定推送哪个远程,而不是要更新的远程分支. (10认同)
  • `git push <remote> <branch>`使事情_unambiguous_.如果你离开遥控器或分支机构git会回到分支配置设置,这些设置是用`git push -u`为你设置的. (4认同)
  • @dahlbyk我已经开始将你标记为答案,但这个评论有点让我感到困惑.在你的回答中,你证明了git**在'git push origin test`(没有`-u`)之后被混淆了.然后你展示了`git push -u origin test`**删除了模糊性.有没有拼错,还是我只是再次密集? (2认同)
  • 我想我们正在谈论彼此。:) 当我说 `git push &lt;remote&gt; &lt;branch&gt;` 是明确的,我的意思是相对于依赖分支配置的 `git push` 。同样,“git pull &lt;remote&gt; &lt;branch&gt;”是明确的,“git pull”依赖于分支配置。使用“-u”进行推送后,“git push”和“git pull”都将按预期工作。 (2认同)
  • git 的最佳实践是“git push origin master”,其他 IE 也是如此。`git pull origin master` .. 因此,如果假设分支发生变化,那么您可以 `git push originbranch_name` 并对另一端 IE 进行相同的操作。`git pull origin 分支名称` (2认同)

sab*_*ton 76

git push -u origin master
Run Code Online (Sandbox Code Playgroud)

是相同的:

git push origin master ; git branch --set-upstream master origin/master
Run Code Online (Sandbox Code Playgroud)

如果忘记了,请做最后的陈述-u!

或者你可以强迫它:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master
Run Code Online (Sandbox Code Playgroud)

如果你让命令为你做,它会选择你的错误,就像你输入一个不存在的分支或你没有git remote add,虽然这可能是你想要的:).

  • 较新版本的 git 表明 `--setup-upstream` 将被弃用: `--set-upstream 标志已被弃用并将被删除。考虑使用 --track 或 --set-upstream-to` (3认同)
  • 顺便说一句`master`只是一个例子:) (2认同)
  • 如果您忘记使用`-u`选项,请立即输入`git push -u`即可. (2认同)

Adé*_*gun 37

用更简单的术语来说:

从技术上讲,该-u标志会向您要推送的上游服务器添加跟踪引用.

这里重要的是,这可以让你在git pull不提供任何参数的情况下完成.例如,一旦你做了git push -u origin master,你可以稍后打电话git pull,git就会知道你的意思git pull origin master.

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

  • 我们也可以使用“git push”而不是“git push origin master”吗? (3认同)
  • 因此,如果我将 `-u` 标志设置为 `orgin master`,则每次拉取都会引用它。如果我想改变 `git pull` 行为,我应该运行 `git push -u origin some_other_branch` 并且 `git pull` 现在将引用 `some_other_branch` 吗?谢谢! (2认同)
  • 是的,你可以@cegprakash。但是,您最初会做一个`git push -u origin master` (2认同)
  • 我想要一个简单的答案..我觉得这是最好的答案!其他人听起来太技术性,对我来说无法理解任何东西 (2认同)