38

根据文档,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 分支,但我的本地 origin/master 仍然在原处。强迫我做以下事情

git fetch origin master

git checkout origin/master
git log --pretty=format:'%h' -n 1
2222222

这是 git pull 的正确行为还是我配置了一些错误?我查看了 git pull 手册页并没有看到任何建议,但我可能错过了。

4

4 回答 4

30

这有点奇怪,但如果你使用git pull [remote] <refspec>它实际上不会更新远程参考。如果您以某种方式考虑它是有道理的:由于您指定要获取的特定 ref,它不必查找有关远程分支的任何内容,因此它本质上并不知道它是哪个远程分支应该更新。它当然可以解决,如果它最终得到修复,我不会感到惊讶,但这是现有的行为。(邮件列表上可能有关于它的消息 - 我不知道。)

不过,您可以轻松解决它。如果您使用git pull origin/master,因为您指定要通过远程分支获取的内容,它应该更新该远程分支。而且,如果您无论如何都在您的主分支上(或任何其他跟踪源/主的分支),您可以这样做git pull并让它填写默认值,它会更新远程分支。

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

接下来将远程分支合并到当前分支:

$ git pull origin next

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

$ git fetch origin
$ git merge origin/next
于 2011-12-31T22:02:40.130 回答
0

看来您已经分叉了存储库,并且您的分叉分支未使用最新代码更新

于 2019-05-31T19:53:32.297 回答
0

我也遇到了这个问题 - 我在分支上运行“git pull”然后检查日志并且它没有更新。困惑我实际上阅读了 git pull 的输出,它特别提到你需要告诉 git 在哪里合并,这是通过“git pull [remote] [local branch]”的命令完成的,即对我来说是“ git pull origin newfeature1"。

第一次尝试有问题​​的命令:

Z:\Abusers\jd\repo1> git pull
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 16 (delta 7), reused 15 (delta 7), pack-reused 1
Unpacking objects: 100% (16/16), done.
From github.abc.com:group1/repo1
   06aefba..e5ed6ee  develop    -> origin/develop
   af689cb..b8667a6  newfeature1-> origin/newfeature1
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> newfeature1

工作命令:

Z:\Abusers\jd\repo1> git pull origin newfeature1
From github.abc.com:group1/repo1
* branch            newfeature1-> FETCH_HEAD
Updating af689cb..b8667a6
Fast-forward
.../file1.py                |   2 +-
abc/yes1/cool1.a        | Bin 0 -> 106329 bytes
.../abc.py                    |   7 ++++---
3 files changed, 5 insertions(+), 4 deletions(-)
create mode 100644 abc/yes1/cool1.a
于 2020-04-28T17:56:33.290 回答
0

如果你从任何地方运行拉,origin例如

git pull <url> ...

即使 url 实际上与origin git 相同的 repo/url 也不会更新远程的任何远程跟踪分支origin ——本质上是一个默认的 repo“容器”,它没有链接到这个 git 调用中的工作树。

要解决此问题,您应该添加默认情况下的远程<->本地(原点)映射(refspec)+refs/heads/*:refs/remotes/origin/*

git pull <anything> +refs/heads/*:refs/remotes/origin/*
于 2021-09-28T16:50:06.527 回答