【问题标题】:Why does git not fetch the pull request I merged in GitHub?为什么 git 不获取我在 GitHub 中合并的拉取请求?
【发布时间】:2019-09-10 15:27:50
【问题描述】:

我遇到了一些 git 问题。我的设置如下:

[工作站回购] -origin-> [网络驱动裸回购] -origin-> [GitHub]

我刚刚在 GitHub (this one) 上接受了我的第一个拉取请求并将其合并到 master。现在我想把它拉到我的工作站上。所以我在网络驱动器上执行git fetch,然后在我的工作站上执行git pull,但在我的工作站上,git 说“已经是最新的”并拒绝合并更改(我检查过,它不在我的工作区中) .

网络驱动器上git branch -vv的输出包括以下行:

* master                    0fe40e2 [origin/master: behind 2] Some small code improvements

工作站存储库上git branch -vv 的输出包括以下行:

* master         0fe40e2 [origin/master] Some small code improvements

他们应该指向的实际提交是3388641。看起来在网络驱动器上的裸仓库中,master 分支以某种方式落后于 origin/master。我不知道这种情况是如何产生的,也不知道如何解决。我不能使用git pullgit reset,因为它是一个裸仓库。

有谁知道我如何确定问题所在以及如何解决?

【问题讨论】:

    标签: git github git-merge git-pull git-fetch


    【解决方案1】:

    我不确定这个单独的裸克隆的目的是什么(你说的裸克隆是在网络驱动器上),但如果它不是 mirror 克隆——镜像是一种特定类型的裸克隆——它有自己的分支名称,独立于所有其他 Git 存储库。1 因此,您需要告诉它更新任何特定分支如果以及何时您希望它从属于其他 Git 存储库。

    我不能使用git pullgit reset,因为它是一个裸仓库...

    确实不能使用git pull,因为它是一个裸存储库,git pull 表示运行git fetch,然后运行第二个 Git 命令,第二个 Git 命令总是一个需要工作树的。但是,并非您不能使用git reset。你不能做的是混合或硬重置:

    $ git reset
    fatal: mixed reset is not allowed in a bare repository
    $ git reset --hard
    fatal: this operation must be run in a work tree
    

    但是,--soft 重置是允许的:

    $ git reset --soft
    $ 
    

    所以移动本地 master 以匹配 origin/master 的一种方法是:

    $ git reset --soft origin/master
    

    但是,最合适的做法可能是完全停止使用这个裸存储库,或者使用镜像克隆(参见脚注 1)。


    1从技术上讲,即使是镜像克隆也有自己的分支名称。非镜像裸克隆和镜像裸克隆之间的主要区别在于镜像克隆的所有分支名称都从属于其源。2 具体来说,镜像克隆的 fetch 配置是:

    [remote "origin"]
        fetch = +refs/heads/*:refs/heads/*
    

    而不是标准:

    [remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
    

    标准提取设置意味着git fetch 在这样的克隆中运行会更新所有refs/remotes/origin/* 名称以匹配源的refs/heads/* 名称。非标准镜像设置意味着在镜像克隆中运行的git fetch 强制更新所有refs/heads/* 名称,立即忘记(并因此丢失任何只能从其访问的提交)自己的分支名称,转而使用获取的名称。这就是使镜像成为镜像的原因:它通过将其自己的分支名称提交哈希替换为它在远程看到的任何内容,从而丢弃所有 专属于其自己的分支的提交。

    2以上描述假定标准远程名称origin。如果您使用其他名称,一切仍然有效,只是字符串文字不是origin,而是您使用的任何名称。

    【讨论】:

    • 有趣。这似乎表明这永远不会奏效,我只是从未注意到,因为这是我第一次真正从 GitHub 获取一些东西。裸存储库作为本地备份和集中存储库存在,用于处理来自不同位置的代码。它不是镜像克隆;我会研究把它变成一个。谢谢!
    • 好的,git reset --soft 成功了!我找到了一个页面,描述了如何将裸仓库变成镜像仓库,我已经这样做了。我还没有测试过,但我相信它会起作用。非常感谢!
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2022-08-14
    • 2018-07-22
    • 2016-07-28
    相关资源
    最近更新 更多