【问题标题】:Undo local commit in Git在 Git 中撤消本地提交
【发布时间】:2018-05-01 05:09:52
【问题描述】:

我知道这个问题已经被问了数千次,我尝试了所有解决方案,但都没有奏效。

我提交了本地 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>...]'

【问题讨论】:

  • 这是你第一次提交吗?所以重置到 HEAD^ 是不可能的,因为没有提交去。
  • 关闭,但您需要“~”而不是“^”:stackoverflow.com/questions/927358/…
  • @SketchyCoder:不太正确。两者都是有效的,但在不同的上下文中具有不同的含义。所以我最初的问题仍未得到解答:是否只有一次提交,是第一次提交吗?
  • @johndoe,在我提供的链接中你有答案。删除.git文件夹或使用update-ref。

标签: git


【解决方案1】:

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

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

否则您可以删除目录中的 .git 文件夹,然后以 git init 重新开始

【讨论】:

  • 所以除了删除 git 目录没有办法吗??
  • 你刚刚启动了这个 git 存储库吗?没有其他分支或提交吗?
  • @johndoe 那么是的,如果那里没有其他内容,那应该不是问题。这样你就可以重新开始。您的文件不会被删除,并且由于您没有任何现有的提交或分支,因此不会有问题
【解决方案2】:

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

git commit --amend

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

【讨论】:

  • 请记住,这将重写历史,如果他已经有推送的历史,这将导致一些重大问题。
  • 阅读问题!他想改写历史,没有push,这是第一次提交。
  • 我知道。如果他们正在阅读您的答案,这只是对其他人的快速提醒。我只是将其发布为提醒,对您的回答没有任何批评;)
【解决方案3】:

90% 的相关信息已经在其他答案中,但我认为需要澄清一下:

您尝试过的、您认为行不通的事情,之所以行不通只是因为特殊情况,即这是 repo 中的唯一提交。例如

git reset HEAD^

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

仍有几种方法可以撤消提交。有几个人建议删除.git 目录并重新运行git init 可能是最简单的。这假定.git 目录中没有任何价值。当然数据库是空的(除了你不想要的提交);但也许索引中有你关心的东西;或者也许你有一些用钩子设置的东西;或者您不想重新进行配置、遥控器等。无论如何。删除和重新initing 不是您的解决方案可能是有原因的。

那么,下一个建议是使用

git commit --amend

为您的下一次提交。这将告诉 git,与其用当前的 HEAD 提交作为其父提交,不如用新的提交替换当前的 HEAD 提交。新提交将获得与当前 HEAD 提交相同的父级(在本例中为“无”)。当前分支 ref 将移动到新的提交,有效地从历史记录中删除当前的 HEAD 提交。

但也许出于某种原因,您真的想现在修复这个问题,而不是等待下一次提交。老实说,没有太多理由,但为了争论……好吧,你可以这样做。可能是这样的

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

我们在这里所做的是进入“分离的HEAD”状态,这样我们就没有检查出master。这允许我们删除master,然后将其重新创建为“孤儿”分支——即没有历史记录的分支。这再次将错误提交从历史记录中剔除。

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

【讨论】:

  • 雄辩地解释了:)
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多