git pull和git push命令中的origin master和origin/master有什么区别?

4

我是新手,对于git pull和git push命令有一些疑问。

例如:
假设我的本地机器上有两个分支“master”和“newbranch”(本地分支)。

$ git checkout newbranch

$ git branch

  *newbranch           //Assume this is local branch only 
    master

以下命令具体是做什么的呢?

git pull origin master -> 它将从远程 "master" 拉取更改到 "newbranch"(当前检出的本地分支)。

git pull origin/master -> 它将拉取 'local' "master" 的最新更改到 "newbranch"(当前检出的本地分支)。

git push origin master -> 它会将 "newbranch"(当前检出的本地分支)中的新更改推送到 'remote' "master"。

git push origin/master -> ?? 这个命令具体是做什么的呢?

请问有人可以澄清这个疑问吗?

                                                         Thanks in advance 
2个回答

2

一般来说,该命令的语法如下:

git push <remote> [refspec]

如果省略了refspec,则简化为以下内容:
git push <remote>

它的行为取决于在 git config push.default 变量中设置的内容。Git消息如下:

当 push.default 设置为 'matching' 时,git 将本地分支推送到已存在具有相同名称的远程分支。

在 Git 2.0 中,Git 将默认使用更加保守的 'simple' 行为,这只会将当前分支推送到用于更新当前分支的相应远程分支。

要设置 'matching' 模式:

git config --global push.default matching

同时,要设置“简单”模式:

git config --global push.default simple

让我们回到您的具体情况。将提交推送到名为“origin/master”的远程仓库将失败,因为不存在“origin/master”远程仓库(默认远程仓库称为“origin”)。要使其正常工作,您需要手动添加此类远程仓库,例如通过调用以下命令:

git remote add origin/master <git-repository-url>

但请注意,这样的操作会使您的本地git非常混乱,您将不得不处理以下类似的错误:

$ git push origin/master
Counting objects: 5, done.
Writing objects: 100% (3/3), 253 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:sarxos/test.git
   820474f..3706ea9  master -> master
error: unable to resolve reference refs/remotes/origin/master/master: Not a directory
error: Cannot lock the ref 'refs/remotes/origin/master/master'.

还有其他一些:

$ git fetch origin/master
error: unable to resolve reference refs/remotes/origin/master/master: Not a directory
From github.com:sarxos/test
 ! [new branch]      master     -> origin/master/master  (unable to update local ref)
error: some local refs could not be updated; try running
 'git remote prune origin/master' to remove any old, conflicting branches

因此,我不建议使用它。

如果您想将更改推送到origin/master(远程名称为“origin”,远程分支为“master”),则应执行以下操作:

git push origin master

目前,我在本地的一个名为(newbranch)的新分支上。我想直接将从新分支(当前已经切换到新分支)所做的更改推送到“远程主分支”。为此,我可以直接执行“git push origin master”吗? - Vivek
Vivek,“git push origin master”解析为“git push origin master:master”,因此它查找本地分支“master”并将更改推送到远程分支,也称为“master”。如果您想从当前已检入的分支(例如newbranch、bubu或其他)推送,则可以执行“git push origin HEAD:master”,这意味着:从当前分支的HEAD推送到名为“origin”的远程“master”分支。有关更多详细信息,请访问https://git-scm.com/docs/git-push。 - Bartosz Firyn

1

git pull origin mastergit pull origin/master

它将从远程的master拉取更改到“newbranch”(当前检出本地分支)。

确切地说,两者都会执行相同的操作
唯一的区别是origin/master将引用存储在您的仓库中的本地副本。

最佳实践是在拉取之前使用以下命令更新本地仓库:

git fetch --all --prune

git push origin master

将“newbranch”(当前检出的本地分支)中的新更改推送到远程“master”。

有点像
Git 将尝试将当前分支推送到远程主分支,但由于您在不同的分支上(取决于您的本地 Git 版本),Git 不会让您这样做。

如果分支存在于远程,则它将尝试推送到相同的分支名称(跟踪分支),并且再次取决于您的 Git 版本,它将推送到远程或引发错误。

enter image description here


git push origin/master

这将推送到远程跟踪分支。
Git 将使用 origin/master 作为远程名称,并尝试将当前分支名称推送到该远程。

在您的情况下,如果您在 newbranch 上,它将尝试将分支名称 newbranch 推送到名为 origin/master 的远程。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接