我将一个分支拉入
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
,同时保留其历史记录?
我只需要 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
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
在我的情况下,由于文件名大小写约定不同而产生了冲突。如果您在文件名不区分大小写的平台(Windows、macOS)上创作提交,并且更改文件名的大小写(无论是有意还是在我的情况下由于生成的代码),Git 将来可能会使用新名称提交,但 O/S 不会认为该文件已以任何方式发生更改,并且 Git 似乎在此事上遵从 O/S。
这可能会导致奇怪的情况,例如文件
foo.txt
被某个提交删除,即使它从一开始就不存在,因为之前接触它的提交认为它被称为
Foo.txt
。如果您在不区分大小写的平台上按顺序应用提交,则不会出现问题。但是,如果您在区分大小写的平台(例如 Linux)上按顺序应用提交,您将在问题中收到
unable to unlink
错误。您可以通过硬重置到新提交或克隆最新状态的存储库来跳过该问题,但“坏”提交仍将潜伏在历史记录中。这可能应该被视为 Git 中的一个错误,尽管这不是 Git 本身的错,因为它太信任操作系统了。