Git - 如何自动解决"我们删除"樱桃采摘时的冲突

时间:2017-04-10 20:59:56

标签: git git-cherry-pick git-merge-conflict

我运行以下命令:

git cherry-pick SHA --strategy-option theirs

并发出类似的冲突,等待手动解决:

deleted by us: SOME_FILE

有没有办法让git通过添加我们删除的文件自动解决此类冲突?

3 个答案:

答案 0 :(得分:9)

  

我们删除是您在提交中添加的新文件(获取樱桃)。但这些文件不存在于   当前分支(您正在挑选的分支)。

因此,在这种情况下,您必须通过运行

添加这些文件手动
git add <file-path>

但是如果您认为,在采摘樱桃后,当前分支中将不再需要这些文件,在这种情况下,您可以这样做:

git rm <file-path>

答案 1 :(得分:3)

如果您确定要添加所有“我们删除的”文件,则可以执行以下操作:

git status | sed -n 's/deleted by us://p' | xargs git add

或者,如果您要删除所有“我们删除的”文件:

git status | sed -n 's/deleted by us://p' | xargs git rm

答案 2 :(得分:0)

就我而言,在错误弹出之前,我不知道哪个文件需要解决冲突。所以,场景是:我创建了一个新文件,提交了它(ID1),修改了它并在源分支(从樱桃中挑选)再次提交了它(ID2),当我使用了“修改后的”提交ID(ID2)对于cherry-pick,git 抱怨,因为该文件从不存在于目标分支(cherry-pick into)中。

git cherry-pick 抛出以下错误:

CONFLICT (modify/delete): <SOME_FILE> deleted in HEAD and modified in <SHA>... Update the CSV file content. Version <SHA>... Update the CSV file content of <SOME_FILE> left in tree.

git status 显示

deleted by us SOME_FILE

基于 answer 的灵感,这是我尝试过的解决方案。合并工具(例如:此处使用的 vimdiff3)允许我们选择冲突解决方案:使用 (m)odified 或 (d)eleted 文件,或 (a)bort。请注意,合并工具会根据需要创建 *.orig 文件,该文件需要清理。

sha=<enter SHA>
conflict_resolution='m'
file_path=<enter file path in the repo>

if ! git cherry-pick $sha --strategy-option theirs
then
        echo "Auto Merge failed. Attempting to use merge tool."
        yes $conflict_resolution | git mergetool --tool=vimdiff3 -- $file_path
        git clean -f *.orig
        git commit -m "From Jenkins Job: ${JOB_NAME}  Build: ${BUILD_NUMBER}"
        echo "Merge successful using merge tool"
else
        echo "Auto Merge successful."
fi

PS:除了cherry-pick,我想该解决方案也可以应用于典型的合并场景。