根据文档,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
我只在本地提交了第一次,如下所示
git checkout master
git log --pretty=format:'%h' -n 1
1111111
git checkout origin/master
git log --pretty=format:'%h' -n 1
1111111
从这里我做我的拉,看看结果如下:
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
可以看到,pull确实用来自远程源的新提交更新了我的master分支,但是我的本地源/master仍然在原来的位置。
git fetch origin master
git checkout origin/master
git log --pretty=format:'%h' -n 1
2222222
这是git pull的正确行为吗?或者我可能错过了一些配置?我查看了git pull手册页,没有看到任何建议,但我可能错过了它。
5条答案
按热度按时间knpiaxh11#
这有点奇怪,但如果你使用
git pull [remote] <refspec>
,它实际上不会更新远程引用。如果你以某种方式思考,这是有道理的:因为你指定了一个特定的引用来获取,所以它不需要查找任何关于你的远程分支的信息,所以它本质上不知道它应该更新哪个远程分支。它当然可以弄清楚,如果它最终被修复了,我也不会感到惊讶,但这是现有的行为。(邮件列表上可能有关于它的消息-我不知道。)不过,你可以很容易地解决这个问题。如果你使用
git pull origin/master
,因为你指定了通过远程分支获取的内容,它应该会更新远程分支。如果你在master分支上(或者任何其他跟踪origin/master的分支),你可以只执行git pull
,让它填充默认值,它会更新远程分支。这在
git-pull
手册页中有详细说明,在EXAMPLES(示例)下有最简洁的说明,其他地方也有。相关部分:将远程分支合并到当前分支中:
这会在FETCH_HEAD中暂时保留一个next的副本,但不会更新任何远程跟踪分支。使用远程跟踪分支,同样可以通过调用fetch和merge来完成:
eblbsuwk2#
似乎你已经fork了仓库,你的fork分支没有更新最新的代码
osh3o9ms3#
我也遇到过这个问题--我在一个分支上运行了“git pull”,然后检查了日志,它没有被更新。困惑的是,我实际上读了git pull的输出,它特别提到你需要告诉git在哪里合并,这是通过一个命令“git pull [remote] [local branch]”来完成的,对我来说是“git pull origin newfeature 1”。
出现问题的第一个命令尝试:
工作指令:
jw5wzhpr4#
如果你从
origin
以外的任何地方运行pull,例如即使url实际上与
origin
的repo/url相同,git也不会更新origin
remote 的任何远程跟踪分支-本质上是一个默认的repo“容器”,它没有链接到这次git调用的工作树。要解决这个问题,您应该添加远程<->本地(origin)Map(refspec),默认情况下为
+refs/heads/*:refs/remotes/origin/*
:q5lcpyga5#
我尝试了每一个可能的解决方案,我可以从stackoverflow,但没有任何工作,我直到我刚刚尝试了这个,它的工作就像一个魅力。