为什么 git 不获取我在 GitHub 中合并的拉取请求?

Why does git not fetch the pull request I merged in GitHub?

我遇到了一些 git 麻烦。我的设置如下:

[工作站仓库] -origin-> [网络驱动器裸仓库] -origin-> [GitHub]

我刚刚在 GitHub (this one) 上接受了我的第一个拉取请求并将其合并到 master。现在我想把它拉到我的工作站。所以我在网络驱动器上做 git fetch,然后在我的工作站上做 git pull,但在我的工作站上 git 说 'Already up-to-date' 并拒绝合并更改(我检查过,它是不在我的工作区)。

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

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

git branch -vv 在工作站 repo 上的输出包括以下行:

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

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

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

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

I can't use git pull or git reset since it is a bare repo ...

确实不能使用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,而是您使用的任何名称。