git rebase:奇怪的藏匿行为

时间:2016-02-15 10:34:01

标签: git git-rebase git-stash git-checkout

我做了git rebase -i,选择了一个提交进行编辑,git在该提交时停止。

我现在尝试使用git checkout -p stash藏匿 结帐一个补丁。

但这给了我奇怪的旧藏匿内容,而git stash show -p给了我预期的补丁,我想从中结账。

这里发生了什么,如何从藏匿处查看我的大块头? 如果我要提供更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

为什么不在没有checkout命令的情况下直接使用存储?

git stash pop

  

从隐藏列表中删除单个隐藏状态并将其应用于当前工作树状态

git stash apply

  

与pop类似,但不会从隐藏列表中删除状态

git stash show

  

将存储中记录的更改显示为存储状态与其原始父级之间的差异

在您的情况下,您需要使用stash@{<revision>}来执行您希望执行的任何存储操作。

例如:

git stash show -p stash@{0}

查看藏匿内容

# display on the stash content
git stash show stash@{1} -u

# checkout the desired commit and choose the right action you want
git checkout -p stash@{0} -p <path to file>

enter image description here

答案 1 :(得分:0)

首先,让我们查看git checkout的文档。

  

git checkout [-p | --patch] [] [ - ] ...

     

当给出<paths>或--patch时,git checkout不会切换分支。它从索引文件或命名的<tree-ish>(通常是提交)更新工作树中的命名路径。在这种情况下,-b和--track选项毫无意义,并且给出其中任何一个都会导致错误。在更新工作树之前,<tree-ish>参数可用于指定特定的树(即提交,标记或树)以更新给定路径的索引。

     

git checkout with <paths>或--patch用于从索引恢复其原始内容的修改或删除路径,或用名为<tree-ish>的内容替换路径(通常是提交 - ISH)。

正如我们所看到的,-p之后的args应该是一个特定的树(即提交,标记或树),并且你通过了stash。那么,git如何处理stash是关键点。

您可以尝试git checkout stash查看哪个提交git会转到,这就是您实际checkout -p

最后,我认为您可以使用git stash apply使其正常工作。