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

时间:2011-04-18 01:42:48

标签: git

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

来自git push的{​​{1}}:

  

-u

     

- 设置上游

     

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

以下是来自branch.<name>.merge的{​​{1}}:

  

git config

     

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

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

branch.<name>.merge

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

branch.<name>.remote

然而,错误地认为我必须再次从git push -u origin master 推送到git commit -m '[...]' ,我跑了:

origin

那是做什么的?它似乎没有任何影响。我是否“撤消”master

4 个答案:

答案 0 :(得分:279)

关键是“无争议的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 <remote> HEAD会将当前分支推送到<remote>上的同名分支(并设置跟踪,以便您可以git push之后)。

答案 1 :(得分:65)

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,虽然这可能是你想要的:)。

答案 2 :(得分:25)

更简单地说:

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

这里重要的是,这使您可以进行git pull而无需提供更多参数。例如,一旦完成git push -u origin master,您以后就可以调用git pull,而git会知道您的意思是git pull origin master

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

答案 3 :(得分:-8)

所有必要的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