git pull origin master不更新origin/master?

Ken*_*nic 36 git github git-pull git-fetch

根据文档,git pull执行git fetch然后执行git merge,但是在这种情况下执行git pull origin master应该执行git fetch origin master吗?但是,它似乎没有这样做.这是一个例子.

假设我的远程源主站(在我的情况下在GitHub上)具有以下历史:

commit 1111111 : my first commit
commit 2222222 : a commit from someone else
Run Code Online (Sandbox Code Playgroud)

我只在本地进行了第一次提交作为以下节目

git checkout master
git log --pretty=format:'%h' -n 1
1111111

git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111
Run Code Online (Sandbox Code Playgroud)

从这里开始,我看看结果如下:

git checkout master
git pull origin master

git log --pretty=format:'%h' -n 1
2222222

git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111
Run Code Online (Sandbox Code Playgroud)

可以看出,拉实际上确实使用来自远程源的新提交来更新我的主分支,但是我的本地origin/master仍然是它的位置.强迫我做以下事情

git fetch origin master

git checkout origin/master
git log --pretty=format:'%h' -n 1
2222222
Run Code Online (Sandbox Code Playgroud)

这是git pull的正确行为还是我可能会错过配置?我查看了git pull手册页并没有看到任何暗示这一点,但我可能错过了它.

Cas*_*bel 29

这有点奇怪,但如果你使用git pull [remote] <refspec>它实际上不会更新远程refs.如果你以某种方式思考它是有道理的:因为你指定了一个特定的引用来获取它,它不必查找你的远程分支的任何东西,所以它本身并不知道它是什么远程分支它应该更新.它当然可以解决这个问题,如果它最终得到修复我也不会感到惊讶,但那是现有的行为.(邮件列表上可能有关于它的消息 - 我不知道.)

但是,您可以轻松地解决它.如果您使用git pull origin/master,因为您要指定通过远程分支获取的内容,它应该更新该远程分支.如果您无论如何都在主分支机构(或任何其他分支机构跟踪源/主机),您只需执行git pull并让它填写默认值,它将更新远程分支机构.

这在git-pull手册页中有记录,最简洁的是在示例下,但也在其他地方.相关部分:

然后合并到当前分支的远程分支:

$ git pull origin next
Run Code Online (Sandbox Code Playgroud)

这会在FETCH_HEAD中暂时保留下一个副本,但不会更新任何远程跟踪分支.使用远程跟踪分支,可以通过调用fetch和merge来完成相同的操作:

$ git fetch origin
$ git merge origin/next
Run Code Online (Sandbox Code Playgroud)

  • 解决方法似乎对我不起作用:`git pull --rebase origin/master`表示`origin/master不是远程repo`.并且`git pull --rebase origin origin/master`找不到`git pull --rebase origin/master` (4认同)