从旧的存储库生成补丁文件

12

我希望根据旧存储的差异创建一个.patch文件,我可以使用git stash show -p stash@{2}查看。

我尝试了这个方法,但没有成功:

git format-patch stash@{2} --stdout > file.patch

我以为它会像普通的提交一样工作?非常抱歉,可能是我太蠢了。
谢谢!
2个回答

21
git stash show -p的输出本身就是一个有效的补丁。你可以直接使用它:
git stash show -p stash@{2} > file.patch

1

根据git format-patch文档,如果您指定单个提交1,那么:

  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项:

  1. 通用的修订版本范围表达式(请参见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}指代的是一个单独的提交,具体为“藏匿包”中的工作树提交。


谢谢您提供的信息,但约翰直接回答了问题,所以我已经接受了他的回答!祝好! - Matt Fletcher
你可能需要复制你所需的命令,并解释为什么你需要一个邮箱补丁(或者它放置的位置),以复制John的答案 - 使用你的答案会产生两个空白的补丁文件,而@john-zwinck的“只是有效”。 - smaudet

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