Cherry pick在一个不存在的文件中进行了更改



我有两个具有类似架构的repo:

repo1:
- file1
- file2 *(this file is non-existent in repo2)
- folder
- file3
- file4
- file5

repo2:
- file1
- folder
- file3
- file4
- file5

Repo1:的Repo1是远程的

git remote add repo1 http://repo1.git

我需要从repo1到repo2 中挑选提交

git cherry-pick <commit_repo1>

通常一切都很好。但如果我想对不存在的文件进行选择性修改,我就遇到了问题。

变化看起来像:

folder/file4    | 9 ---------
folder/file5    | 5 -----
file1           | 5 -----
file2           | 5 -----
4 files changed, 24 deletions(-)

最后:Cherry pick将不存在的文件合并为file3。仅用于删除更改

有人知道如果需要的文件不存在,如何避免将更改合并到错误的文件?

尝试次数:

git cherry-pick --strategy-option theirs <commit_repo1>
git cherry-pick --strategy-option ours <commit_repo1>

给出相同的结果:

Auto-merging folder/file3 !!! this file was not changes (instead changed in file2)
Auto-merging folder/file4
Auto-merging file1
Auto-merging folder/file3

这看起来像是一个过度渴望重命名检测的情况:Git认为file3与丢失的文件匹配,所以它将更改导入到那里。

您可以禁用重命名检测:

-X no-renames

(即git cherry-pick -X no-renameshash,而不是-X ours-X theirs(以避免该问题。或者,使用git cherry-pick -n,这样Git就不会提交结果,然后通过检查HEAD版本来修复编辑后的文件:

git cherry-pick -n <hash>

检查结果,进行任何所需的更改,包括:

git checkout HEAD -- folder/file3

最终:

git commit

做出新的承诺。

为什么得到这个结果

在挑选提交时,您必须查看由提交引入的更改

根据您的描述,file2似乎出现在父提交中,并且不知何故git计算出file2被重命名为folder/file3

因此:精心挑选的承诺会尽职尽责地尝试应用这种变化。


如何修复此

你可以告诉git完全忽略重命名(正如@torek所回答的(:

git cherry-pick -X no-renames

您可能会在folder/file3上发生冲突(现在是git,因为您正在导入创建folder/file3的提交,但它已经存在于您的目标分支上(,您可以修复该冲突。

或者,您可以在选择后手动修复手头的问题

# it looks like you want to revert `file3` to its previous state :
git checkout HEAD^ -- folder/file3
git commit --amend

相关内容

  • 没有找到相关文章

最新更新