Git - 如何在 cherry-pick 时自动解决“deleted by us”冲突?

18

我运行了以下命令:

git cherry-pick SHA --strategy-option theirs

然后会遇到这样的冲突,需要手动解决:

deleted by us: SOME_FILE

有没有一种方式可以让Git自动通过添加被我们删除的文件来解决这样的冲突?


2
虽然不是自动的,但你可以简单地使用 git add 命令将这些文件添加回来,因为 Git 会在工作树中保留“theirs”版本。你可以编写一个脚本,使用 git ls-files --stage 命令查找在第一阶段和第三阶段存在但在第二阶段不存在的文件:因为 1 = base,2 = ours,3 = theirs,这些文件恰好是“deleted by us”。 - torek
3个回答

23

被我们删除的是您在提交中添加的新文件(被 cherry-pick)。但是这些文件在当前分支中不存在(您正在将其 cherry-pick 到的分支)。

因此,在这种情况下,您需要通过运行以下命令手动添加这些文件:

git add <file-path>
然而,如果您认为在cherry-pick后这些文件在当前分支中不再需要,那么您可以执行以下操作:
git rm <file-path>

1
或者使用 git add . 来简单地添加 cherry-pick 中的所有文件(忽略我们分支中的删除)。 - Muhammad Yasirroni

12

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

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

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

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

Windows 命令是什么? - Muhammad Yasirroni
为了使这个命令适用于包含空格的文件名:git status | sed -n 's/\tdeleted by us: //p' | awk '{ printf "\"%s\"\n", $0 }' | xargs git add - altius_rup

0
在我的情况下,直到错误弹出之前,我不知道哪个文件需要解决冲突。所以,场景是:我创建了一个新文件,在源分支(cherry-pick from)中提交了它(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)、删除的文件(d)或中止(a)。请注意,合并工具会创建*.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

附注:除了使用cherry-pick,我想这个解决方案也适用于典型的合并场景。


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