【问题标题】:Why doesn't git format-patch work for stashes?为什么 git format-patch 不适用于存储?
【发布时间】:2011-06-03 13:16:21
【问题描述】:

如果我跑步

git format-patch -1 stash@{0}

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

【问题讨论】:

  • 我认为您的意思是 stash@{0},而不是 git stash list 显示为我的名字。仅使用 stash{0} 会返回有关修订不存在的错误。我不知道为什么它不起作用。
  • @jonescb:对,那只是一个错字,抱歉。
  • 我可能应该提一下,目前我必须使用 git 1.6.6
  • 这也取决于您使用的外壳,但有时您必须转义 {}。当我使用 zsh 或 fish 时,它就会发生在我身上。然后变成git format-patch -1 stash@\{1\} > mypatch.txt

标签: git patch git-stash


【解决方案1】:

这似乎是因为存储提交表示为合并(在其父状态和当时的索引状态之间),而合并提交上的 format-patch 什么都不做。

如果你说

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

然后它会在 stash 和每个父级之间吐出补丁。

为了说明,这就是存储的样子:

*   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} 表示法。
【解决方案2】:

你可以试试

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

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

documentation of git-stash的show选项下描述

【讨论】:

  • 谢谢,我知道这一点,但我一直在寻找一种方法来生成与 git am 兼容的补丁,而且我很好奇发生了什么。
  • @unclezeiv 您是否以某种方式与git am 绑定,或者您可以使用git apply
【解决方案3】:

我可以想到两种方法。

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

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

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

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

我不知道为什么你不能只保留未添加到索引中的文件并运行 git format-patch 'stash@{0}^1'..'stash@{0}'

这似乎是一回事。 stash 提交对象一定有什么特别之处。在任何情况下,添加到索引都会记录存储的第二个父级(索引提交)中的更改,绕过存储提交的问题。

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

【讨论】:

    【解决方案4】:

    如果您的文件是使用 git stash -u 隐藏的,那么 git stash show -p 将不起作用

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2013-03-25
      • 2018-07-02
      • 2020-07-08
      相关资源
      最近更新 更多