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

8

我正在将一个分支合并到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 merge - Jacob Sievers
@JacobSievers 同样的问题,我正在使用 pull,因为我可以使用 --force,而合并不可能。 - Skwiggs
你在 master 分支上有本地提交记录需要保留吗?或者直接使用 origin/master 分支上的版本完全覆盖你的 master 分支也可以吗? - Rory O'Kane
@RoryO'Kane master 分支没有任何提交,我们从不直接向其提交...只通过合并进行提交。是的,可以完全从源覆盖。 - Skwiggs
2个回答

4

我只需要主分支包含来自新分支的所有更改。

然后,您可以强制合并,以反映该分支 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

这难道不会使第一个父提交记录与主分支的历史不一致吗? - Yazeed Sabri
@YazeedSabri 我认为是这样的。对于保留第一个父级的解决方案,请参考:https://dev59.com/nnVC5IYBdhLWcg3w0EsD#4969679 - VonC
如果我理解正确的话,你的解决方案的第一部分先将feature/some_branch更新为master的内容,但我想避免这种情况。我将尝试使用你答案的第二部分。 - Skwiggs
@VonC 所以我运行了您回答中第二部分的命令,它解决了问题。您能否理想地重新表述您的答案,使该部分更突出?我会将其标记为已接受并提供悬赏 :) - Skwiggs
1
@Skwiggs 抱歉,更新晚了:我离开了。我已经相应地重新编写了答案。 - VonC

0

如果你想用origin/master上的版本替换你的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

这并不会保留master的历史记录,而我想要保留它。同时本地和远程都已经与其对应的分支同步了。说实话,在任何情况下删除master都听起来不太对。:d - Skwiggs
@Skwiggs,那我不明白你的问题了。我以为你在回复我的评论时说这就是你想要的... - Rory O'Kane
“master”和“origin/master”本质上是相同的,对吧?因此,用远程的“master”覆盖我的本地“master”是可以的(实际上它们应该始终保持同步,现在它们已经同步了)。但我想避免的是丢失“master”的提交历史记录。也许我们对“origin/master”有不同的理解? - Skwiggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接