在Git中撤消本地提交

时间:2017-11-17 12:11:23

标签: git

我知道这个问题已经被问了好几千次,我尝试了所有的解决方案而没有工作。

我已经提交了我的本地2-3文件,现在我想撤消提交。我怎么能这样做:这也是第一次提交。

git reset HEAD^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

更新:

git reset --soft HEAD~1
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

更新2:

git reset --hard HEAD~1
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

3 个答案:

答案 0 :(得分:3)

90%的相关信息已经出现在其他答案中,但我认为有一点澄清:

您尝试过的,您认为不起作用的事情,只是因为特殊情况,这是回购中唯一的提交。例如

git reset HEAD^

表示将索引和当前分支(假设有当前分支)返回到先前的提交。但是没有先前的提交,所以git不知道你的意思。

还有几种方法可以撤消提交。有人建议删除.git目录并重新运行git init 可能是最简单的。这假设.git目录中没有任何价值。当然数据库是空的(除了你不想要的提交);但也许你在索引中关心的是什么;或者你可能有挂钩设置的东西;或者你不想重新做配置,遥控器等等。可能有理由说删除和重新init不适合您。

接下来的建议是使用

git commit --amend

用于下一次提交。这将告诉git,不应使用当前HEAD提交作为其父提交进行新提交,而应使用新提交替换当前HEAD提交。新提交将获得与当前HEAD提交相同的父级(在本例中为“none”)。当前分支引用将移至新提交,从历史记录中有效删除当前HEAD提交。

但也许由于某种原因你真的想要修复这个现在而不是等待下一次提交。老实说,没有太多理由,但为了争论......嗯,你可以做到这一点。它可能类似于

git checkout --detach
git branch -d master
git checkout --orphan master

我们在这里做的是进入“分离的HEAD”状态,以便我们没有master签出。这允许我们删除master,然后将其重新创建为“孤儿”分支 - 即没有历史记录的分支。这再次将糟糕的承诺从历史中剔除。

值得注意的是,这些技术都不会立即删除旧提交;但它们确实确保它不会被包含在任何推送或默认log输出等中。一旦它滚动reflog并且垃圾收集器赶上,提交将最终消失。如果您不想等待,可以采取一些步骤立即删除提交。 (因为你的repo基本上是空的,那里有一个选项 - 再次最简单,除非它有负面的副作用 - 将删除.git目录并重新init。)

答案 1 :(得分:2)

如果这是你的第一次提交,那么没有什么可以恢复。在这次提交之前,没有git知道的状态。

也许您可以使用https://www.atlassian.com/git/tutorials/rewriting-history

编辑提交

否则,您可以删除目录中的.git文件夹,然后使用git init

重新开始

答案 2 :(得分:1)

由于这是第一次提交最好的方法是将您的索引更新为您要实现的状态然后

git commit --amend

https://nathanhoad.net/git-amend-your-last-commit