我有一个浅层克隆,我做了三次提交。
这是日志:
$ git log --oneline --graph --decorate --all
* d3456fd(HEAD,master)补丁3
* 9713822补丁2
* 6f380a6补丁1
*来自完整克隆的8a1ce1e(origin / master,origin / HEAD)
* 7c13416从浅浅添加 * 3b3ed39删除了电子邮件
* cfbed6c进一步修改
* a71254b为2.1版添加 * 7347896(移植)对第2版的更改
现在我从这里创建一个补丁:
$ git format-patch -k --stdout origin> ../format_since_origin.patch
我想在另一个克隆中应用此补丁,这是一个完整的克隆
这是日志:
$ git log --oneline --graph --decorate --all
*来自完整克隆的8a1ce1e(HEAD,origin / master,master) * 7c13416从浅浅添加 * 3b3ed39删除了电子邮件
* cfbed6c进一步修改
* a71254b为2.1版添加 * 7347896发布2的更改 * b1a8797更改为ttwo文件
* 603710c更改了测试报告
* 16b20b3添加了test_report.txt
* f0871ea修改了file1.xml
* dd94bfc添加了file1.xml
* 00758aa第二次提交 * 49f9968首次提交
我无法应用上面浅层克隆创建的补丁。我收到以下错误。
$ git am -3 /c/temp/git/format_since_origin.patch
适用:补丁1
使用索引信息重建基础树...
错误:补丁失败:file1.c:6
错误:file1.c:补丁不适用
你有没有手动编辑你的补丁? 它不适用于其索引中记录的blob 不能回退到三方合并 修补程序在0001补丁1时失败 当你解决了这个问题后,运行“git am --resolved” 如果您希望跳过此补丁,请运行“git am --skip” 要恢复原始分支并停止修补运行“git am --abort”。
知道这个补丁失败的原因吗?或者我的方法完全错了?
适用于以下
$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch 适用:补丁1 适用:补丁2 适用:补丁3
现在,正如查尔斯所建议的那样 - 如果我尝试使用git diff,我会得到如下错误。
$ git diff -p origin> ../dif_origin.patch
申请时,
$ git apply --ignore-whitespace --inaccurate-eof /c/temp/git/dif_origin.patch
c:/temp/git/dif_origin.patch:9:尾随空格。
file1.c的补丁更改
c:/temp/git/dif_origin.patch:18:尾随空格。
补丁这个xml的家伙 c:/temp/git/dif_origin.patch:29:尾随空格。
fsdfsd
c:/temp/git/dif_origin.patch:30:尾随空格。
修补此报告
错误:补丁失败:file1.c:6
错误:file1.c:补丁不适用
错误:补丁失败:file1.xml:2
错误:file1.xml:补丁不适用
错误:补丁失败:tr / test_report.txt:2
错误:tr / test_report.txt:补丁不适用
答案 0 :(得分:13)
请注意,必须忽略空格的一个基本原理是(June 2010):
它的作用是启用
GMail -> download -> git-am workflow
GMail(以及无数其他无数的)电子邮件提供商在原始电子邮件消息的开头引入空格,否则将保持原样。
如“git am/format-patch
: control format of line endings”中所述,您可以尝试:
git am --keep-cr
这不需要你忽略空格(仅警告)。
OP maxmelbin确认以下有效的in the comments:
git am -3 --keep-cr --committer-date-is-author-date /c/temp/git/format_since_origin.patch
答案 1 :(得分:11)
当git apply正常工作时,你根本就没有输出:
$ git apply example.patch
[nothing returned]
如果你想看看幕后发生了什么,你可以使用-v(详细)标志:
$ git apply -v example.patch
Checking patch includes/common.inc...
Applied patch includes/common.inc cleanly.
但是,如果在你自己的本地git工作副本中运行git apply,那么即使使用-v(详细)标志,git apply也不会执行任何操作,并且不提供任何输出。如果发生这种情况,请检查您在目录树中的位置 - git apply可能在其他位置工作。
git apply的替代方法是使用patch命令:
$ patch -p1 < example.patch
这是git apply命令可以生成的其他输出,以及它的含义。 补丁不适用
$ git apply example.patch
error: patch failed: includes/common.inc:626
error: includes/common.inc: patch does not apply``
Git无法应用补丁中的更改,因为它无法找到相关代码行;它们必须已被另一次提交更改或删除。试试这些:
确保补丁尚未应用。在git-log中查找它或者只是检查代码以查看更改是否已经存在。如果他们是,你就完成了。如果他们不是或者只是其中一些人,请尝试别的:
使用patch -p1 < filename.patch
。虽然git-apply完全拒绝任何有错误的补丁,但补丁-p1会按照hunk工作,尽可能多地应用个别更改。它在修改文件之前将每个文件备份为filename.ext.orig,并在filename.ext.rej
中保存被拒绝的文件。丢弃.orig文件并手动应用.rej中剩余的更改。对于小补丁来说,这是一个简单的策略。
答案 2 :(得分:8)
确定。以下工作。
$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch
适用:补丁1
适用:补丁2
适用:补丁3
为什么我在申请时需要忽略空格?