git stash show -p | git apply --reverse
警告:并非所有情况下都适用:“git apply -R
”(man) 无法正确处理两次更改相同路径的补丁,这已在 Git 2.30(Q1 2021)中得到修正。
这在将路径从常规文件更改为符号链接(反之亦然)的补丁中最为相关。
查看提交b0f266d(2020年10月20日),作者为Jonathan Tan (jhowtan
)。
(由Junio C Hamano -- gitster
--在提交c23cd78中合并,于2020年11月2日)
apply
:当使用-R
时,同时反转章节列表
协助者:Junio C Hamano
签名者:Jonathan Tan
一个将符号链接更改为文件的补丁被写成了两个部分(在代码中表示为“struct patch”):首先,删除符号链接;其次,创建文件。当使用
-R
应用该补丁时,这两个部分会被颠倒,因此我们得到:(1)创建符号链接,然后(2)删除文件。这会导致问题,因为Git观察到所谓的文件不是文件而是符号链接,在检查“删除文件”部分时导致“错误类型”的错误消息。我们想要的是:(1)删除文件,然后(2)创建符号链接。在代码中,当从
check_preimage()
调用
previous_patch()
进行检查时,这反映在
previous_patch()
的行为上。先创建再删除意味着在检查删除时,
previous_patch()
返回创建部分,触发模式冲突,导致“错误类型”的错误消息。但是,删除然后创建意味着在检查删除时,
previous_patch()
返回
NULL
,因此删除模式将与lstat进行检查,这正是我们想要的。补丁还可以包含引用同一文件的两个部分的其他方式,例如,在
7a07841c0b(“
git-apply
:更好地处理多次操作相同路径的补丁”,2008-06-27,Git v1.6.0-rc0 --
merge)中。
git apply -R
(man)以同样的方式失败,而此提交使该情况成功。因此,在构建部分列表时,当传递
-R
时,以相反的顺序构建它们(通过在列表的前面添加而不是后面添加)。