我有一些麻烦。我的设置如下:
[工作站回购] -origin-> [网络驱动器裸仓] -origin-> [GitHub]
我刚接受了我在GitHub(this one)上的第一个pull请求并将其合并为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。它看起来像在网络驱动器上的裸仓库中,主分支在某种程度上落后于origin / master。我不知道这种情况是如何产生的,或者如何解决它。我不能使用git pull
或git reset
,因为它是一个简单的回购。
有谁知道我如何确定问题是什么以及如何解决它?
我不确定这个单独的裸克隆的目的是什么(裸你的克隆是你所说的是在网络驱动器上),但如果它不是镜像克隆镜像是一种特殊类型的裸克隆 - 它有它的自己的分支名称,独立于所有其他Git存储库。因此,如果您希望它自己从属于其他Git存储库,您需要告诉它更新任何特定分支。
我不能使用
git pull
或git 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/*
名称以匹配origin的refs/heads/*
名称。非标准镜像设置意味着git fetch
在镜像克隆中运行强制更新所有refs/heads/*
名称,立即忘记(从而丢失任何单独可从其提交的提交)其自己的分支名称,而不是使用获取的名称。这就是使镜像成为镜像的原因:它通过用它在遥控器上看到的任何内容替换它自己的分支名称提交哈希来删除任何对其自己的分支独有的提交。
2以上描述假定标准远程名称origin
。如果你使用了其他名称,一切都仍然存在,那就是代替origin
,字符串文字就是你用过的名字。