我有两个具有类似架构的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