【问题标题】:git pull origin master does not update origin/master?git pull origin master 不更新 origin/master?
【发布时间】:2012-01-31 02:56:23
【问题描述】:

根据文档,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 手册页并没有看到任何建议,但我可能错过了。

【问题讨论】:

标签: git github git-pull git-fetch


【解决方案1】:

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

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

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

下一个远程分支合并到当前分支:

$ git pull origin next

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

$ git fetch origin
$ git merge origin/next

【讨论】:

  • 它被埋在git-pull 联机帮助页的某个地方,我想。如果我记得,我会在稍后的某个时间尝试追捕它。
  • @KennethBaltrinic:它在示例部分,也可以从文档的其余部分推断出来。
  • 解决方法似乎对我不起作用:git pull --rebase origin/masterorigin/master not a remote repo。而git pull --rebase origin origin/master 找不到git pull --rebase origin/master
  • git fetch origin 完成了这项工作。谢谢。
【解决方案2】:

您似乎已经分叉了存储库,并且您的分叉分支没有使用最新代码更新

【讨论】:

    【解决方案3】:

    我也遇到了这个问题——我在分支上运行“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
    

    【讨论】:

      【解决方案4】:

      如果你从 origin 以外的任何地方运行 pull,例如

      git pull <url> ...
      

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

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

      git pull <anything> +refs/heads/*:refs/remotes/origin/*
      

      【讨论】:

        猜你喜欢
        • 2011-02-22
        • 2020-07-27
        • 2013-05-04
        • 2013-09-25
        • 2017-10-20
        • 2021-10-14
        • 2012-05-22
        相关资源
        最近更新 更多