git 有没有办法将提交的更改转储到工作树?

问题描述

我提交了一些更改,其中包含我不想提交的更改,因此我想删除该提交,但保留已提交的暂存和未暂存更改,以便我可以在提交之前删除不需要的更改。我使用了 git reset --hard <hash> 但它恢复到 HEAD - 1 处的提交,这不仅删除了提交,还删除了提交前的所有暂存和未暂存更改。

有什么方法可以重置提交,而是将所有提交的更改(返回)转储到工作树而不是删除该提交中记录的每个更改?换句话说,如何将所有已提交的更改返回到工作树?

解决方法

简答:git stash


长答案:运行 git stash 会将工作目录和索引重置为当前头,通过撤消您对它们所做的任何更改。它将这些更改的记录存储在 stash 中,其形式与提交非常相似。

如果此时您运行 git status,它应该表明没有任何变化。 (未跟踪的文件仍会显示。git stash 对未跟踪的文件没有影响。)

然后您可以对提交历史进行任何您想要的更改,可能使用 git commit --amendgit rebase。完成后,运行 git stash pop。将从存储中检索更改并重新应用于索引和工作目录。

您甚至可以在 git stashgit stash pop 之间更改分支,如果您意识到自己一直在错误的分支上工作,这将非常有用。

请注意,就像提交一样,git stash 存储 更改 而不是快照(我完全不同意之前的答案,在这个问题上)。因此,当您运行 git stash pop 时,可能会出现合并冲突,就像您运行 git cherry-pick 时一样。