我有一个浅的克隆,我做了三次提交.这是日志:
$ git log --oneline --graph --decorate --all
*d3456fd(HEAD,master)patch 3
*9713822 patch 2
*6f380a6 patch 1
*8a1ce1e(origin/master,origin/HEAD)from full clone
*7c13416 from浅
*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)from full clone
*7c13416 from shallow
*3b3ed39 removed email
*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
现在,正如Charles所建议的 - 如果我尝试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:补丁不适用
Von*_*onC 14
请注意,必须忽略空格的一个理由是(2010年6月):
它做的是启用
GMail -> download -> git-am workflow
.
GMail(以及无数其他无数的)电子邮件提供商在原始电子邮件消息的开头引入空格,否则将保持原样.
如" git am/format-patch
行结尾的控制格式 "中所述,您可以尝试:
git am --keep-cr
Run Code Online (Sandbox Code Playgroud)
这不需要你忽略空格(仅警告).
该OP maxmelbin证实在评论即以下工作:
git am -3 --keep-cr --committer-date-is-author-date /c/temp/git/format_since_origin.patch
Run Code Online (Sandbox Code Playgroud)
Man*_*ava 11
当git apply正常工作时,你根本就没有输出:
$ git apply example.patch
[nothing returned]
Run Code Online (Sandbox Code Playgroud)
如果你想看看幕后发生了什么,你可以使用-v(详细)标志:
$ git apply -v example.patch
Checking patch includes/common.inc...
Applied patch includes/common.inc cleanly.
Run Code Online (Sandbox Code Playgroud)
但是,如果在你自己的本地git工作副本中运行git apply,那么即使使用-v(详细)标志,git apply也可能无效,并且不提供任何输出.如果发生这种情况,请检查您在目录树中的位置 - git apply可能在其他位置工作.
git apply的替代方法是使用patch命令:
$ patch -p1 < example.patch
Run Code Online (Sandbox Code Playgroud)
这是git apply命令可以生成的其他输出,以及它的含义.补丁不适用
$ git apply example.patch
error: patch failed: includes/common.inc:626
error: includes/common.inc: patch does not apply``
Run Code Online (Sandbox Code Playgroud)
Git无法应用补丁中的更改,因为它无法找到有问题的代码行; 它们必须已被另一次提交更改或删除.试试这些:
确保尚未应用修补程序.在git-log中查找它或者只是检查代码以查看更改是否已经存在.如果他们是,你就完成了.如果他们不是,或者只是其中一些,请尝试其他方法:
使用patch -p1 < filename.patch
.虽然git-apply完全拒绝任何有错误的补丁,但补丁-p1会按照hunk工作,尽可能多地应用个别更改.它在修改文件之前将每个文件备份为filename.ext.orig,并保存被拒绝的文件filename.ext.rej
.丢弃.orig文件并手动应用.rej中剩余的更改.对于小补丁来说,这是一个简单的策略.
好.以下工作.
$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch
申请:补丁1
申请:补丁2
申请:补丁3
为什么我在申请时需要忽略空白?