如何在Git中撤销最后一次提交并将更改存储到工作区?

30

我有一个名为 feat-a 的分支,我想“撤销”我的最后一次本地提交,只保留这些文件的暂存状态。然后当它们都被暂存时,我想要将这些更改进行存储。

现在我所做的听起来有点反向,但是这个问题的原因是在主分支上进行了强制推送以重新编写一些提交作者,因此将主分支合并或变基到/到feat-a中会完全破裂并产生大量冲突,尽管主分支和feat-a只相差一个提交。

我已经阅读了一个类似的问题:如何隐藏我的上一个提交?

但这并不一定是我想要做的。我只想取消暂存并隐藏我的最后一次直接提交,而不是像那位用户想要的那样(即从其他提交之间拉出一个提交)。


你错误地使用了“staged”这个词。在将更改存储之前,你不需要或不想要进行分阶段操作。你希望更改出现在工作目录中,但不出现在索引中。 - William Pursell
有趣。谢谢你提醒我。如果你有任何关于那个词汇的好资源,请告诉我,但是我几乎总是使用“staging”区域来添加通过“git add .”添加的任何内容。 - c_idle
谢谢你,@eftshift0。 - c_idle
1
我已删除之前的评论并进行了更正(我写错了一个单词,使其变得多余...)。我的意思是:@WilliamPursell 现在阅读您的评论(即使已经有一个答案被接受)。我认为他使用这些术语是正确的。唯一需要指出的是,对于已经被跟踪的文件,没有必要将更改暂存以便将它们藏起来...但是对于新文件,如果您想将它们藏起来,您必须添加它们(或者使用更多的大脑记忆来学习和使用git-stash中的选项之一,如果有任何包括新文件的选项)。 - eftshift0
1个回答

73
git reset --soft HEAD~1
git stash save "Saving instead" # or something like that

2
只是提醒一下:如果代码已经被推送,而你想要撤销并储藏它,我们可以在执行上述命令之前使用 git cherry-pick <commit_id> - Tushar Walzade
1
作为对您评论的回应,即使在重置/隐藏后,“cherry-pick”仍然是一种选择。提交并不会立即被销毁,它将保持可供检查或“cherry-pick”,直到最终被垃圾收集。 - Romain Valeri

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