当我在intellij的终端上执行git pull时,我看到了下面的错误。这个项目经常被几个开发者更新,我确信有些东西不同步,但我不知道是什么。
error: cannot lock ref 'refs/remotes/origin/feature/SOMETHING-1234': is at e131d16d4b4b8c32e3d16d28559baf2e4d18b012 but expected 090916d9bee669944a2ea55703f25a4ebee7d51a
! 090916d9b..e131d16d4 feature/SOMETHING-1234 -> origin/feature/SOMETHING-1234 (unable to update local ref)
这里可能有什么问题?我该如何解决这个问题?上面的功能分支是由另一个开发人员创建的,我不想删除它。
2条答案
按热度按时间ws51t4hk1#
注意:这个 * 是 * 重复的,但是另一个问题没有可接受的答案,所以我在这里发布一个。问题的发生是因为有人创建了一个分支(在上面的例子中是
feature/SOMETHING-1234
),这个分支与你的Git已经选择的名称 * 只有大小写 * 不同。例如,你可能有feature/something-1234
或FEATURE/SOMETHING-1234
,而他们现在有feature/SOMETHING-1234
。Git相信只有大小写不同的名字,比如
a
和A
,是 * 不同的名字 *。这在 * 某些时候 * 是正确的。它在某些操作系统上失败了1 * 某些时候 *。当它失败时--就像你的情况一样--你会得到奇怪的症状,就像你现在看到的一样。在这种情况下,一种可能的解决方法是删除(本地)文件
.git/refs/remotes/origin/feature/something-1234
--你可以用小写输入它,而不管任何部分有大写;请参阅脚注1-在运行git fetch
之前。您的Git将使用另一个Git提供的大小写重新创建此名称。但请注意,问题很可能会再次出现,甚至可能会立即出现,特别是如果另一个Git始终 * 可以 * 存储 * 两个 * 名称(例如,feature/something-1234
* 和 *feature/SOMETHING-1234
)。要更持久地解决这个问题,需要在 other Git中 delete 重复的名称。也就是说,如果GitHub Git有名为
feature/SOMETHING-1234
和feature/something-1234
的分支,你和你的同事们必须在这两个名字中达成一致意见,保留哪个,删除哪个,然后你就可以而且应该删除“错误的”名字一个并确保永远不要重新创建它。(我认为Git正在进行的工作将为每个人解决这个问题,但还没有发布。
1从技术上讲,这是一个 * 文件系统特定的问题 *,而不是操作系统特定的问题。但是,它通常发生在Windows和MacOS文件系统上,这些系统被设置为保留大小写但折叠大小写。也就是说,如果您创建了一个名为
ReadMe
的文件,然后要求系统打开一个名为readme
或README
的文件,它打开现有的ReadMe
文件。其他文件系统--包括Linux主机上常用的文件系统,比如运行GitHub的系统--将
readme
、ReadMe
和README
视为三个不同的文件。因此,这些系统可以同时存储所有三个文件。Windows和MacOS上的大小写折叠文件系统实际上无法存储三个这样的文件。Git目前使用的是一种混合模式,其中 refs 或 references-分支、标签和其他名称-存储在两个位置中的一个或两个:一种简单的纯文本表文件,每行有一个引用及其哈希ID,或者每个文件有一个哈希ID,文件的 name 与引用名匹配。当引用仅大小写不同时,每个文件的存储机制只能在可以存储两个名称的文件系统上正常工作。尽管如此,一个大文件的存储机制即使在通常的Windows和MacOS文件系统上也能正常工作。因为所有条目都在名为
.git/packed-refs
的文件中。请注意,如果引用同时出现在
.git/packed-refs
* 和 * 单个文件中,则单个文件版本将覆盖.git/packed-refs
版本。jtw3ybtb2#
我打开终端并使用下面的命令,并为我工作。写这个命令后,这保持拉动所有分支没有错误
git remote prune origin