我遇到了一些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。看起来在网络驱动器的裸仓库中,主分支以某种方式落后于原始服务器/主服务器。我不知道这种情况是如何产生的,或如何解决的。我不能使用git pull
或git reset
,因为它是一个裸仓库。
有人知道我如何确定问题所在以及如何解决该问题吗?
答案 0 :(得分:2)
我不确定这个单独的裸克隆的目的是什么(裸克隆就是您所说的那个在网络驱动器上),但是如果它不是 mirror 克隆,那么镜像就是一种特殊类型的裸克隆—它具有自己的分支名称,独立于所有其他Git存储库。 1 因此,您需要告诉它 update 任何特定分支是否以及何时要将其自身奴隶到其他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/*
名称,以匹配原始的refs/heads/*
名称。非标准的镜像设置意味着运行在镜像克隆中的git fetch
会强制更新所有refs/heads/*
的名称,立即忘记(并因此丢失仅可从其访问的所有提交)其自己的分支名称,而倾向于使用提取的名称取而代之。这就是使镜像成为镜像的原因:它将被专有的所有提交都删除,方法是将其自己的分支名称提交哈希替换为在远程服务器上看到的任何内容。
2 上面的描述采用标准的远程名称origin
。如果您使用其他名称,则所有内容仍将保留,只是字符串文字而不是origin
,而是您使用的任何名称。