从旧存储生成补丁文件

时间:2014-09-30 09:09:25

标签: git

我希望基于旧藏匿的差异创建.patch文件,我可以使用git stash show -p stash@{2}

查看

我试过了,但没有运气:

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

我认为它会像正常提交一样工作吗?对于最有可能超级厚重的道歉。

谢谢!

2 个答案:

答案 0 :(得分:1)

git stash show -p的输出本身就是一个有效的补丁。您可以直接使用它:

git stash show -p stash@{2} > file.patch

答案 1 :(得分:1)

the git format-patch documentation,如果您指定一次提交, 1 则:

  
      
  1. 单个提交 since ,指定通往当前分支的提示的提交,这些提交不在导致 since的历史记录中输出。
  2.   

因此,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 syntax表示format-patch文档的第1项中的内容。

一种解决方案是继续format-patch文档中的第2项:

  
      
  1. 通用修订版范围表达式(请参阅gitrevisions(7)中的“指定修订版本”部分)表示指定范围内的提交。
  2.   

在这里,您只需要指定“在隐藏包中w提交之前”到“w提交本身”的提交,这只是stash@{2}^..stash@{2}

git format-patch [additional options like --stdout here] stash@{2}^..stash@{2}

由于这是一次提交,因此仅使用git show(作为John Zwinck suggested)的唯一区别是补丁的精确格式化(format-patch默认使邮箱样式补丁)。


或者,您可以始终使用git stash branch将存储空间转换为“真正的分支”。如果需要,这会将存储的索引commit i转换为实际提交,并在创建后恢复工作目录状态(以及未跟踪或所有文件状态,如果其中一个包含在存储中)从父提交开始的新分支,即隐藏包附加到的分支。提交生成的工作树,你有一个普通的分支,你可以用所有普通的分支操作(包括format-patch)来操作。


1 请参阅some of my other descriptions about git "stash bags"以查看存储是一小堆提交,但请注意,名称stash@{2}标识单个提交,特别是工作树提交在“藏匿袋”中。