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

3
如果我运行
git format-patch -1 stash@{0}

Git没有创建任何文件就悄悄地返回了,为什么会这样?我该如何以与 git am 兼容的格式保存一个暂存区?


我认为你的意思是 stash@{0},因为 git stash list 在我的电脑上显示它是这个名称。只使用 stash{0} 会返回一个关于修订版本不存在的错误。但我不知道为什么它不起作用。 - jonescb
@jonescb:没错,那只是个打错字,抱歉。 - UncleZeiv
我应该提一下,目前我必须使用 git 1.6.6 - UncleZeiv
这也取决于您使用的shell,有时您必须转义{}。当我使用zsh或fish时,就会发生这种情况。然后变成了git format-patch -1 stash@\{1\} > mypatch.txt - renoirb
4个回答

4
这似乎是因为stash提交被表示为合并(其父级和当时的索引状态之间的合并),而对于合并提交,使用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

你的推理是有道理的,但你提出的解决方案仍然会产生一个空提交。如果你有其他想法,请注意我可以直接使用提交的sha id,而不是 stash@{0} 表示法。 - UncleZeiv

1

你可以尝试一下

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

这将为最新的修补程序和原始父级在您的桌面上生成一个补丁文件。

git-stash文档中的show选项下进行了描述。


谢谢,我知道这个,但我正在寻找一种生成与 git am 兼容的补丁的方法,而且我对发生了什么很好奇。 - UncleZeiv
@unclezeiv,你是否与git am有关联,还是可以使用git apply - Kelvin

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:如何为合并创建补丁?以获取更多详细信息。


-1
如果您使用 git stash -u 进行隐藏文件,那么 git stash show -p 将无法工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接