Git能像git rebase一样行内应用补丁并留下冲突标记吗?

21

使用git rebase会在文件中内联留下冲突标记,类似于:

<<<<<<< HEAD
Whatever line + context is different from the previous commit
=======
Whatever line + context is different from the commit being applied
>>>>>>> new version, new branch:app/views/common/version.txt

当我使用git apply 命令来应用通过 git format-patch 命令创建的补丁时,它默认不会修改任何文件。可以使用 --reject 参数强制生成 .rej 文件以标记那些无法解决冲突的文件,但是实际上,我想要的是让它修改文件并像 git rebase 命令一样使每个文件处于已修改状态,这样我就可以打开文件,手动合并它,然后使用 git add 命令添加它,并告诉 git apply 命令继续执行。是否有一些我不知道的方法可以做到这一点呢?

3个回答

10

对我来说,以下内容有效:

git init
seq 1 30 > file
git add file
git commit -m 1-30
sed -i '13a13.4' file
git commit -m 'add 13.4' file
git format-patch -1
git reset --hard HEAD^
sed -i 13d file
git commit -m 'remove 13' file
git am -3 0001-add-13.4.patch

之后那个 file 具有冲突标记。因此使用git am -3而不是git apply


嗯,有趣的是,它似乎确实做到了我想要的。我原以为git am使用的是git apply命令,也许它使用了一个不可通过git apply命令行选项访问的内部API。谢谢! - kcstrom
2
简述:使用git amgit apply命令时加上-3选项。这个选项会告诉Git在冲突发生时执行合并而不是中止操作。 - Hi-Angel

8

另一个解决方案是使用patch --merge来应用补丁,而不是使用任何git工具。当我需要从完全不同的git repo中带来一些更改时,这对我来说效果更好,因此我无法(轻松地)使用git am -3git apply -3


它甚至可以执行:patch --merge=diff3 - Jan Kratochvil
这解决了“无法工作的问题:错误:补丁失败:file.cpp:383 错误:存储库缺少必要的blob以回退到3路合并。错误:file.cpp:补丁不适用” - Kevin
+1 非常感谢教我使用 --merge,这正是我所需要的。更多细节请参考:https://man7.org/linux/man-pages/man1/patch.1.html(如果您附近有 Linux/GNU 环境,则只需输入 man patch 即可。不确定 --merge 是否属于 POSIX 标准)。 - Per Lundberg

8

使用带有三方合并的选项:

git apply -3 0001-patch.patch

1
无法工作: 错误:打补丁失败:file.cpp:383 错误:存储库缺少必要的Blob以回退3-way合并。 错误:file.cpp:补丁不适用。 - Jan Kratochvil

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