撤销 Git 的提交并取消暂存,不生成新的提交记录

119
通常使用 git revert 命令会自动创建一些提交记录,其中的提交日志消息指出哪些提交被还原。
为了避免自动提交,可以使用选项 -n(或 --no-commit)。
但是在执行此命令后,被还原的文件会位于暂存区中。可以通过使用命令 git reset HEAD 来取消暂存。
是否有一种直接的方法可以还原提交而不进行提交和暂存呢?
换句话说:是否有一种直接的命令可以将更改应用于工作目录,而不触及索引来还原提交?

这会是什么样子?如果您没有撤销更改,那么“还原”是什么意思? - Edward Thomson
2
我只想将本地文件应用已还原的更改,没有提交和处理暂存区。如果您执行 git revert -n <HASH> && git reset HEAD,就会发生这种情况,但我希望一次完成。 - lornova
4
明白了,您希望将还原的更改应用于工作目录但不暂存。再仔细阅读您的问题后,这一点似乎很清楚,但我第一次阅读时无法正确解析其含义。 - Edward Thomson
可能是我的错,我试图在问题中澄清我的意图。 - lornova
1
@sschuberth:这是两个步骤。当然,它不会引起问题,但我想知道是否有一种直接的方法来实现这个目标。 - lornova
显示剩余2条评论
1个回答

107

没有单个命令可以实现此功能。正如您所注意到的那样,您可以将git revert -ngit reset结合使用,以撤消索引中的还原。

除了该方法,您还可以使用git apply -R来“反向应用”补丁,您可以使用git show将提交转换为补丁,因此:

$ git show <rev> | git apply -R

使用git revert -n命令也能达到相同的效果,只不过有一个(微妙但重要的)区别。让我引用一下git revert文档并强调一下:

-n, --no-commit
通常该命令会自动创建一些提交记录,说明哪些提交被还原了。此标志将应用还原指定提交所需的更改到您的工作树和索引中,但不会进行提交。此外,当使用此选项时,您的索引不必与HEAD提交相匹配。还原是针对您的索引的初始状态进行的。

换句话说,git revert -n在索引中进行操作,并更新您的工作树,其副作用是更新您的工作树。而git apply命令(默认情况下)仅在工作树上操作,实际上可以在git存储库之外使用。


我收到了“错误:无法识别的输入”的信息。有什么想法是出了什么问题吗? - Robert Pankowecki
1
@RobertPankowecki: https://www.google.com/search?&q=git+apply+unrecognized+input 的第一个搜索结果是关于彩色差异的 StackOverflow 帖子。那似乎是最可能的问题。 - torek
那么在执行 git revert --no-commit 后,我该如何继续操作呢?当我执行 git revert --continue 时没有任何反应。 - Dr_Zaszuś
@Dr_Zaszuś:在执行 git revert --no-commit 后,您可以像往常一样继续工作:如果需要,编辑文件,如果需要,使用 git add 命令,如果需要,使用 git rm 命令,最后执行 git commit 命令。 - torek

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