我有下面的场景:
1.在main
分支(我们称之为PR-1234
)上创建 * 并合并 * 了一个PR,其中包含一系列修复
1.我需要将相同的修复应用到一些较旧的版本分支(例如release/1.1
、release/1.2
)。
警告是这些分支比我的main
分支 * 更老 *。有些文件可能不存在,或者有不同的名称。
所以我想我应该:
1.到原PR的patch-diff.githubusercontent.com/raw/.../1234.patch
获取电子邮件格式的补丁,另存为文件,如~/1234.patch
1.从release/1.1
创建一个新分支,并使用git am ~/1234.patch
将步骤1中的修补程序应用到新分支。
1.解决冲突,根据需要进行一些手动更改,并合并到release/1.1
中
但是,当我运行git am
时,会得到如下输出
Applying: xxx changed: refactoring ClassName
.git/rebase-apply/patch:80: trailing whitespace.
.git/rebase-apply/patch:82: trailing whitespace.
.git/rebase-apply/patch:136: trailing whitespace.
.git/rebase-apply/patch:139: trailing whitespace.
.git/rebase-apply/patch:150: trailing whitespace.
error: [file1]: does not exist in index
error: [file2]: does not exist in index
error: [file3]: does not exist in index
error: [file4]: does not exist in index
Patch failed at 0001 xxx changed: refactoring ClassName
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
很明显,分支之间的差异太大,无法应用补丁。这是我可以解决的问题吗?如何解决?或者有没有其他方法可以将PR 1234
中的 * 大多数更改 * 应用到另一个较旧的分支,只需 * 一些 * 手动操作。我的目标当然是避免在所有分支上逐行手动更改。
先谢了。
1条答案
按热度按时间z8dt9xmd1#
以下是
git apply
和git am
的一些选项,可能会有所帮助。--include=<path>
它只应用指定路径的差异。例如,
--include=foo/bar/*
,--include=foo/bar/baz.c
。可以使用多个--include
。使用此选项,我们不必将补丁拆分为更小的补丁。--exclude=<path>
不应用指定路径的差异。
--directory=<root>
假设补丁中的路径是
x/y/z.c
,而你的代码中的路径是a/b/x/y/z.c
,在这种情况下,我们可以使用--directory=a/b
,这样diff就会应用到a/b/x/y/z.c
。-p<n>
假设补丁中的路径为
foo/bar/a.c
,而代码中的路径为foi/baz/a.c
,文件名相同,其父路径不同。前导的
a/
是源前缀,b/
是目标前缀。大多数情况下,它们是a/
和b/
。它们可以是其他字符或不存在。我们可以使用
-p3 --include=foo/bar/a.c --directory=foi/baz
将foo/bar/a.c
应用于foi/baz/a.c
。-p<n>
删除了n
的前导组件(由斜杠分隔,n
默认为1)。在示例中,它是a/foo/bar
,有3个组件。-p3 --include=foo/bar/a.c
指示将a/foo/bar/a.c
的diff应用到a.c
。但是,目的路径是foi/baz/a.c
,所以我们添加--directory=foi/baz
。如果补丁中的路径与代码中的路径完全不同,我认为我们必须手动编辑补丁中的路径。