【问题标题】:What exactly does the "u" do? "git push -u origin master" vs "git push origin master"“u”具体是做什么的? “git push -u origin master”与“git push origin master”
【发布时间】:2011-08-07 13:15:33
【问题描述】:

我在使用 git 方面显然很糟糕,尽管我尽了最大努力去理解它。

来自kernel.orggit push

-u

--设置上游

对于每个最新或成功推送的分支,添加上游(跟踪)引用,由无参数 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 fetch 标记为在 FETCH_HEAD 中合并的默认 refspec。该值的处理方式类似于 refspec 的远程部分,并且必须与从"branch.<name>.remote" 给出的远程获取的 ref 匹配。 git pull(首先调用 git fetch)使用合并信息来查找默认分支以进行合并。如果没有这个选项, git pull 默认会合并第一个获取的 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了吗?

【问题讨论】:

  • I'm apparently terrible at using git, despite my best attempts to understand it. - 从来没有人如此完美地重塑过我。

标签: git


【解决方案1】:

关键是“无参数的 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 按预期工作而无需指定远程或分支。

更新:额外提示:

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

【讨论】:

  • git push &lt;remote&gt; &lt;branch&gt; 让事情变得明确。如果您离开远程或分支 git 将退回到分支配置设置,这些设置是使用 git push -u 为您设置的。
  • @dahlbyk 我已经将您标记为答案,但该评论让我有些困惑。在您的回答中,您证明了在git push origin test(没有-u)之后git 混淆了。然后,您表明 git push -u origin test 删除歧义。是有错别字,还是我只是又密集了?
  • 我认为我们正在谈论彼此。 :) 当我说git push &lt;remote&gt; &lt;branch&gt; 是明确的时,我的意思是相对于依赖于分支配置的git push。同样,git pull &lt;remote&gt; &lt;branch&gt; 是明确的,git pull 依赖于分支配置。使用 -u 推送后,git pushgit pull 将按预期工作。
  • @dahlbyk:你的答案很好,但是在上面的 cmets 中,你重复了一个关于 git pushcommon misconception - 除非你自己设置了 push.defaultgit push 只使用上游分支配置来决定要推送到哪个远程,而不是要更新的远程分支。
  • git 的最佳实践是git push origin master,对另一端 IE 也是如此。 git pull origin master .. 所以如果假设分支发生变化,那么你可以git push origin branch_name 和另一侧的 IE 相同。 git pull origin branch_name
【解决方案2】:
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;虽然这可能是你想要的。 :)

【讨论】:

  • 顺便说一句 master 只是一个例子:)
  • 好的,第二位现在在较新的版本中被折旧:git branch master -u origin/master details @stackoverflow.com/a/2286030/790359
  • 如果您忘记使用-u 选项,立即输入git push -u 即可。
  • 较新版本的 git 表明 --setup-upstream 将被弃用:The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
  • --set-upstream 已弃用,现在可以使用:git branch --set-upstream-to=origin/master master
【解决方案3】:

更简单的说法:

从技术上讲,-u 标志添加了对您要推送到的上游服务器的跟踪引用。

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

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

【讨论】:

  • 因此,如果我将-u 标志设置为orgin master,则每次下一次拉动都会引用它。如果我想更改 git pull 行为,我应该运行 git push -u origin some_other_branchgit pull 现在将引用 some_other_branch ?谢谢!
  • 我们也可以使用“git push”而不是使用“git push origin master”吗?
  • 是的,你可以@cegprakash。但是,您最初会执行 git push -u origin master
  • 我想要一个简单的答案.. 我觉得这是这里最好的一个!!!其他人听起来太技术性了,我无法理解任何事情
【解决方案4】:

所有必要的 git bash 命令来推入和拉入 Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

如果你想编辑一个文件,那么:

edit filename.* 

查看所有分支及其提交:

git show-branch

【讨论】:

  • 我认为您的回答超出了问题的范围。
猜你喜欢
  • 2020-07-30
  • 2013-09-22
  • 2018-07-30
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
相关资源
最近更新 更多