Git Merge:错误:无法取消链接旧<file>:没有这样的文件或目录

问题描述 投票:0回答:3

我将一个分支拉入

master
以合并它。

我正在运行的命令是(同时签出

master
):
git pull origin feature/some_branch

不幸的是,我的同事似乎在那里执行了一些(我认为是良性的)文件删除,现在 git 输出了一个

error: unable to unlink old 'somefile': No such file or directory

我尝试在网上查找,但此错误的大多数参考资料都与权限有关,但这里的情况并非如此。

有问题的文件在合并之前不存在于 master 上,而存在于新分支中。

问题是

master

已经很长时间没有更新了,所以有太多的更改和文件受到影响,我无法开始弄清楚代码。

我只需要

master

 包含来自新分支的所有更改。我们从不直接向 
master
 提交任何内容,总是通过合并。 

到目前为止我尝试过的:

    使用
  • --force
    参数,同样的问题
  • git reset origin/master --hard
    并再次运行
    pull
    ,同样的问题

如何在不关心此类问题的情况下使用另一个更新的分支更新master

,同时保留其历史记录?

git git-pull unlink
3个回答
4
投票
我只需要 master 来包含来自新分支的所有更改。

然后你可以强制合并,以反映该分支的内容

feature/some_branch

但是您可以使用

类似的想法

,而不是使用
merge --ours master,它保留了第一父级历史记录:

git checkout master # make merge commit but without conflicts!! # the contents of 'ours' will be discarded later git merge -s ours feature/some_branch # make temporary branch to merged commit git branch tmp # get contents of working tree and index to the one of feature/some_branch git reset --hard feature/some_branch # reset to our merged commit but # keep contents of working tree and index git reset --soft tmp # change the contents of the merged commit # with the contents of feature/some_branch git commit --amend # get rid off our temporary branch git branch -D tmp # verify that the merge commit contains only contents of feature/some_branch git diff HEAD feature/some_branch
    

0
投票
要将

master

 分支替换为 
origin/master
 上的版本,您可以尝试删除并重新创建它。执行此操作时不需要签出
master
,因此您可以避免与更改工作目录相关的错误。

首先查看您可以查看的不同分支:

git checkout feature/some-branch

然后删除您本地的

master

 分支并重新创建它,包括其跟踪信息:

git branch --delete master git branch master origin/master git branch --set-upstream-to=origin/master master

最后,尝试切换到新的

master

git branch checkout master
    

0
投票
我遇到这个问题是因为我有类似的问题。虽然其他答案已经解决了可能的修复问题,但我认为我已经找到了原因。

在我的情况下,由于文件名大小写约定不同而产生了冲突。如果您在文件名不区分大小写的平台(Windows、macOS)上创作提交,并且更改文件名的大小写(无论是有意还是在我的情况下由于生成的代码),Git 将来可能会使用新名称提交,但 O/S 不会认为该文件已以任何方式发生更改,并且 Git 似乎在此事上遵从 O/S。

这可能会导致奇怪的情况,例如文件

foo.txt

 被某个提交删除,即使它从一开始就不存在,因为之前接触它的提交认为它被称为 
Foo.txt
 。如果您在不区分大小写的平台上按顺序应用提交,则不会出现问题。但是,如果您在区分大小写的平台(例如 Linux)上按顺序应用提交,您将在问题中收到 
unable to unlink
 错误。您可以通过硬重置到新提交或克隆最新状态的存储库来跳过该问题,但“坏”提交仍将潜伏在历史记录中。

这可能应该被视为 Git 中的一个错误,尽管这不是 Git 本身的错,因为它太信任操作系统了。

© www.soinside.com 2019 - 2024. All rights reserved.