How to uncommit my last commit in Git
如何取消在Git中提交最后一个提交?
它是
或
?
- 对于git,我发现手册页通常是最好的参考(或者,git help reset)。
- 请在这里查看stackoverflow.com/a/49130829/7178104
- @理查德,请选择一个正确的答案,无论哪个对你有用。让许多人的生活更轻松!
如果您不完全确定"取消提交"是什么意思,也不知道是否要使用git reset,请参见"恢复到以前的git提交"。
如果你想更好地理解git reset,请看"你能用简单的英语解释一下"git reset"是什么吗?".
如果你知道你想使用git reset,它仍然取决于你所说的"取消提交"是什么意思。如果您只想撤消提交操作,保留所有其他操作,请使用:
如果您想撤消提交操作以及您准备的所有操作,但要保留工作树(您的文件是完整的):
如果您真的想完全撤消它,放弃所有未提交的更改,将所有内容重置为上一次提交(如原始问题所问的那样):
最初的问题也问它是HEAD^而不是HEAD。HEAD是指当前提交——通常是指当前签出分支的提示。^是一个可以附加到任何commit说明符的符号,意思是"commit before"。所以,HEAD^是在当前提交之前的提交,就像master^是在主分支的尖端之前的提交一样。
这里是Git Rev解析文档的一部分,描述了指定提交的所有方法(^只是许多方法中的一个基本方法)。
- 回复:"答案忽略了提到它的头为什么,而不是头,这是最初的问题"-这似乎是错误的:最初的问题实际上不是问"为什么",只是"它是哪一个"。不过,拥有更多的背景还是有帮助的。
- @请不要以改变答案含义的方式编辑答案。
- @杰弗洛米:这个问题的每一个答案都是完全错误的,强调——硬的,软的,是"取消最后一次提交"的必要条件,硬的不仅会取消提交,还会破坏你的提交。我几乎毁了一整天的工作,因为我没有重新检查——这意味着假设70+的答案不会是错误的。幸运的是,reflog挽救了我的一天,但它不一定是那样的。
- @佩德罗·斯兰谢谢。很高兴你费心读完第一句话。
- @Jameshfisher是对最初问题的回答("这两个问题中哪一个是?")在它下面有一个巨大的警告。我正在编辑,但是…如果你看到一个从标题看起来像你想要的问题,你只是盲目地运行你在第一个答案中看到的第一个命令,这将继续发生在你身上。
- 我要找的是江户十一〔四〕!!!!那么甜蜜,对现在的工作头脑来说,什么是改变?或目录。
- 你提到的三个案例就是我想要的。出色的工作。
- git reset HEAD^给了我zsh: no matches found: HEAD^的,但git reset HEAD~1的作品
- zsh用户注意:使用git reset 'HEAD^'。
- @卡斯卡贝尔,你能不能再加上一点,那就是变化仍然是阶段性的?我认为初学者可能会混淆soft和默认(mixed)选项。我会自己编辑它,但我不能百分之百肯定这是事实。
- @Cascabel,我在想,混乱的根源可能来自于当改变发生时出现的信息,git status是键入的,它是use"git reset HEAD ..." to unstage。消息是正确的,但由于尚未提交更改,因此应使用HEAD而不是HEAD^。也许,你想澄清一下,否则有人会得出结论,重新调整头部总是毫无意义的。
- 如果只有本地提交是第一次提交呢?git reset--soft"head^"致命:不明确的参数"head^":工作树中不存在未知的修订或路径。使用"--"将路径与修订分开,如下所示:"git[…]--[…]"
从要撤消的提交中保留更改
从要撤消的提交中销毁更改
你也可以说
返回2次提交。
编辑:正如charsi所提到的,如果您在Windows上,您将需要在引号中放入head或commit hash。
1 2
| git reset --soft"HEAD^"
git reset --soft"asdf" |
- git reset --soft HEAD^ More? More? fatal: ambiguous argument 'HEAD ': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git [...] -- [...]'怎么回事?为什么在git里什么都不起作用?我讨厌它。
- @Violetgiraffe你可能在窗户上,需要做一些事情。
- @查西:确实是在窗户上。谢谢你的小费。
- 很好的答案,我要做的是在~/.gitconfig中创建add[alias]uncommit=reset--soft head^….然后我可以只写git uncommit,它将软重置最后一次提交
- 好小费@Woodydrn
- Windows提示:如果您太懒了,不想输入附加引号,也可以使用head(例如git reset--soft head~),它与"head^":完全相同。
git reset --soft HEAD^将在您的工作树中保留修改后的更改。
git reset --hard HEAD^将丢弃您所做的更改!!!!
注意,reset --hard也会删除您的本地(未提交)修改。
注意:如果你在Windows上,你需要引用标题^所以
- 你不必用msysgit的git bash引用克拉的话。
- 我试过了,只是在这里浪费了几天的时间。请阅读下面的soft版本,它将在本地保留您的工作。
- 请注意,这不仅会撤消提交操作,而且会丢弃您的更改。
- 正如对那些在不想放弃更改的情况下错误运行此命令的人所做的注释一样,您的更改并没有消失,它们只是被隐藏了。您可以使用git reset --hard HEAD@{1}撤消此操作,返回您刚才所在的位置。(HEAD@{1}的意思大致是"我刚才在1点改变的承诺",在这种情况下,就是你告诉Git你想摆脱的承诺。键入git reflog查看最近的所有更改。)
只是一个提示-如果您使用zsh并看到错误
1
| zsh: no matches found: HEAD^ |
你得逃出江户十一〔九〕号
如果您还没有推动您的更改,那么使用git reset --soft [Hash for one commit]回滚到特定的提交。--soft通知git保留正在回滚的更改(即,将文件标记为已修改)。--hard通知git删除正在回滚的更改。
- 我刚刚了解到,在没有破坏任何东西的情况下,随后的git重置——软头——会在没有干预承诺的情况下保持向后滚动。幸运的是,我推到一个空的存储库,并从中恢复。很好的学习这些东西的非破坏性,可恢复的方式。
- @八达通必须是我在Git(BeautifulUndo)上见过的最有用的评论,请把它作为答案。这真的值得称赞。
如果你犯了错误
在错误的分支上时:
git log -2给出了最后两个承诺的散列,比如$prev和$last。
git checkout $prev签出正确承诺
git checkout -b new-feature-branch为功能创建了一个新分支
git cherry-pick $last用您的更改修补分支
然后,您可以按照上面建议的方法之一从第一个分支中删除提交。
小心点。
但是您可以使用REBASE命令
一个vi将打开,您所要做的就是删除带有commit的行。也可以阅读正确版本@vi中显示的指令,在这种模式下可以执行一些操作。
- 那是什么?小心点?它是Git重置吗?我会同意的。
- REBASE命令。您可以用它销毁提交历史记录。