为什么git format-patch不能用于存储?

时间:2011-01-04 17:33:45

标签: git patch git-stash

如果我跑

git format-patch -1 stash@{0}

git以静默方式返回而不创建任何文件。为什么会这样?如何以与git am兼容的格式保存藏匿处?

4 个答案:

答案 0 :(得分:4)

这似乎是因为存储提交表示为合并(在其父级和当时的索引状态之间),并且合并提交中的format-patch不执行任何操作。

如果你说

git format-patch stash@{0}{,^}

然后它会在藏匿处和每个父母之间吐出补丁。

为了说明,这就是隐藏的样子:

*   99aedb8 (refs/stash) WIP on master: 668ff36 initial commit
|\  
| * 6b8d77f index on master: 668ff36 initial commit
|/  
* 668ff36 (HEAD, master) initial commit

答案 1 :(得分:1)

你可以尝试

git stash show -p > ~/Desktop/stash.patch

这将在桌面上生成最新补丁和原始补丁的补丁文件。

在show选项<{p>下的documentation of git-stash中描述

答案 2 :(得分:0)

我可以想到两种方式。

解决方案1:从藏匿处创建分支。这种方式违背了存储功能的最初目的,即避免必须创建单独的分支。

解决方案2:在存储之前,将对跟踪文件的所有更改添加到索引中。存储后,运行

git format-patch 'stash@{0}^1'..'stash@{0}^2'

将HEAD与索引进行比较(在创建存储时)。

我不确定为什么你不能将文件保持未添加到索引并运行 git format-patch 'stash@{0}^1'..'stash@{0}'

这似乎是一回事。存储提交对象必须有一些特殊的东西。在任何情况下,添加到索引都会记录存储的第二个父级(索引提交)中的更改,从而绕过存储提交的问题。

其他说明: 对于合并提交,git format-patch -1将始终为空(存储是合并提交的特殊情况)。我不完全确定为什么会这样,但请参阅Git: How to create patches for a merge?了解更多细节。

答案 3 :(得分:-1)

如果您的文件使用git stash -u隐藏,则git stash show -p无效