我希望根据旧存储的差异创建一个.patch
文件,我可以使用git stash show -p stash@{2}
查看。
我尝试了这个方法,但没有成功:
git format-patch stash@{2} --stdout > file.patch
我以为它会像普通的提交一样工作?非常抱歉,可能是我太蠢了。
谢谢!
我希望根据旧存储的差异创建一个.patch
文件,我可以使用git stash show -p stash@{2}
查看。
我尝试了这个方法,但没有成功:
git format-patch stash@{2} --stdout > file.patch
git stash show -p
的输出本身就是一个有效的补丁。你可以直接使用它:git stash show -p stash@{2} > file.patch
根据git format-patch
文档,如果您指定单个提交1,那么:
- 一个单独的提交
since
指定了要输出到当前分支末端的提交,这些提交不在导致since
的历史记录中。
因此,format-patch
试图找到“通向当前分支末端”的提交(HEAD
),它们既不是stash@{2}
本身,也不是stash@{2}
的祖先。 如果不知道实际的提交图形,很难准确地说出这些提交将是哪些,但是如果图形看起来像这样:
... - o - o - * - * <-- HEAD=branch
|\
i-w <-- stash@{2}
那么format-patch
将生成一个包含两个标记为*
的提交的补丁:它们是HEAD
的唯一祖先,而在从w
提交开始向后工作时未被删除。
如果图像看起来更像这样:
* <-- HEAD=branch
/
... - o - o - o - o <-- anotherbranch
|\
i-w <-- stash@{2}
然后,你会再次获得标记为*
的提交(这一次只有一个提交,只是为了有点不同)。
(实际上,你得到的提交与stash@{2}..HEAD
完全相同,因为这个gitrevisions
语法的意思是format-patch
文档中第1项的内容)。
一种解决方法是继续阅读format-patch
文档中的第2项:
- 通用的修订版本范围表达式(请参见gitrevisions(7)中的“指定修订版本”部分)表示指定范围内的提交。
在这里,你只需要指定从“在存储区中的w
提交之前”到“w
提交本身”的提交,即stash@{2}^..stash@{2}
:
git format-patch [additional options like --stdout here] stash@{2}^..stash@{2}
由于这是一个单个提交,与仅使用git show
(如John Zwinck建议的那样)之间的唯一区别在于补丁的精确格式化(format-patch
默认制作邮箱式补丁)。
或者,您可以使用git stash branch
将一个stash转换为“真正的分支”。如果需要,这会将stash的索引提交i
转换为一个真正的提交,并在创建从父提交(即附加到stash-bag的提交)开始的新分支后恢复工作目录状态(以及未跟踪或所有文件状态,如果其中一个包含在stash中)。提交生成的工作树,您就有了一个普通的分支,可以使用所有常规的分支操作(包括format-patch
)。
1请查看我的其他描述 关于git“藏匿包”,了解stash是一小批提交的内容,但需要注意的是名称stash@{2}
指代的是一个单独的提交,具体为“藏匿包”中的工作树提交。