ChatGPT解决这个技术问题 Extra ChatGPT

“u”具体是做什么的? “git push -u origin master”与“git push origin master”

git

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

kernel.orggit push

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

以下是来自 git configbranch.<name>.merge

branch..merge 与 branch..remote 一起定义给定分支的上游分支。它告诉 git fetch/git pull 要合并哪个分支,并且还可以影响 git push(参见 push.default)。当在分支 中时,它告诉 git fetch 标记为在 FETCH_HEAD 中合并的默认 refspec。该值的处理方式类似于 refspec 的远程部分,并且必须与从“branch..remote”给出的远程获取的 ref 匹配。 git pull(它首先调用 git fetch)使用合并信息来查找默认分支以进行合并。如果没有这个选项, git pull 默认会合并第一个获取的 refspec。指定多个值以获得章鱼合并。如果您希望设置 git pull 使其从本地存储库中的另一个分支合并到 中,您可以将 branch..merge 指向所需的分支,并使用特殊设置。 (句号)分支。<名称>.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. - 我从来没有人把我塑造得这么好。

d
dahlbyk

关键是“无参数的 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 配置值设置为上游。

git push -u HEAD 会将当前分支推送到 上的同名分支(并设置跟踪,以便之后您可以执行 git push)。


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

更简单地说:

从技术上讲,-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_branch 并且 git pull 现在将引用 some_other_branch ?谢谢!
我们也可以使用“git push”而不是使用“git push origin master”吗?
是的,你可以@cegprakash。但是,您最初会执行 git push -u origin master
我想要一个简单的答案..我觉得这是这里最好的一个!!!其他人听起来太技术性了,我无法理解任何事情
Z
Zenadix

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

我认为您的回答超出了问题的范围。