如何恢复初始git提交?

时间:2011-07-09 01:49:43

标签: git

我第一次提交了一个git存储库;然后我后悔提交并想要还原它。我试试

# git reset --hard HEAD~1

我收到此消息:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

此提交是存储库的第一次提交。知道如何撤消git的初始提交吗?

9 个答案:

答案 0 :(得分:436)

您只需要删除您所在的分支。您不能使用git branch -D,因为这样做有安全检查。您可以使用update-ref执行此操作。

git update-ref -d HEAD

使用rm -rf .git或类似的内容,因为这会彻底清除整个存储库,包括所有其他分支以及您尝试重置的分支。

答案 1 :(得分:48)

您可以删除HEAD并将存储库还原到新状态,您可以在其中创建新的初始提交:

git update-ref -d HEAD

创建新提交后,如果您已经推送到远程,则需要强制它到远程,以覆盖之前的初始提交:

git push --force origin

答案 2 :(得分:11)

此问题与this blog post相关联,并为较新版本的Git提出了替代解决方案:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

此解决方案假定:

  1. 您的master分支机构只有一个提交
  2. 没有名为old_master的分支,因此我可以自由使用该名称
  3. 它会将现有分支重命名为old_master并创建一个新的,孤立的分支master (就像为新存储库创建的那样)之后您可以自由删除old_master ......或不。由你决定。

    注意:移动或复制git分支会在删除时保留其reflog(请参阅this code),然后创建新分支会将其销毁。由于您想要恢复到没有历史记录的原始状态,您可能想要删除分支,但其他人可能想要考虑这个小记。

答案 3 :(得分:8)

在问题规定的条件下:

  • 提交是存储库中的第一个提交。
  • 这意味着执行的命令非常少:
    • a git init
    • 大概是git add次操作,
    • git commit
    • 就是这样!

如果满足这些先决条件,则撤消初始提交的最简单方法是:

rm -fr .git

来自您git init所在的目录。然后,您可以重做git init以重新创建Git存储库,并使用您后悔没有第一次进行的任何合理的更改重做添加,并重做初始提交。

危险!这会删除Git存储库目录。

它永久地删除了Git存储库目录,并且无法恢复,除非你在某个地方有备份。在前提条件下,您没有想要保留在存储库中的任何内容,因此您不会丢失任何内容。 您添加的所有文件仍然可以在工作目录中使用,假设您尚未修改它们并且尚未删除它们等等。但是,只有在您的存储库中没有任何其他内容时,这样做才是安全的。在第一次提交存储库问题中描述的情况下 - 然后后悔它,它是安全的。但是,很多时候,它并不安全。

执行此操作以删除不需要的克隆存储库也是安全的;它对从中克隆的存储库没有任何损害。它会丢弃您在副本中完成的任何操作,但不会影响原始存储库。

小心,但在满足前提条件时安全有效。

如果您已经对要保留的存储库执行了其他操作,那么这不是适当的技术 - 您的存储库不再满足此要求的前提条件。

答案 4 :(得分:3)

你不能。所以:

rm -rf .git/
git init
git add -A
git commit -m 'Your new commit message'

答案 5 :(得分:2)

我想知道为什么不建议使用“修改”,而是被@damkrat删除了,因为在我看来,修改只是最有效地解决修复错误提交的根本问题的正确方法,因为这没有目的。没有初始提交。正如一些人强调的那样,如果没有人克隆您的存储库,则仅应像master一样修改“ public”分支。

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"

答案 6 :(得分:0)

git reset --hard 进行更改,然后执行

git add -A
git commit --amend --no-edit 

git add -A
git commit --amend -m "commit_message"

然后

git push origin master --force

- 强制将重写您在第一步中重置的提交。

不要这样做,因为你要反对VCS系统和git的整个想法。唯一好的方法是创建新的并删除不需要的分支。有关信息,请参阅git help branch

答案 7 :(得分:0)

您所要做的就是恢复提交。

git revert {commit_id}'

然后推它

git push origin -f

答案 8 :(得分:0)

最后我将介绍对我有用的东西。 我需要删除存储库上的初始提交,因为隔离数据放错了位置,该提交已经被推送。

确保您当前在正确的分支上。

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

这能够解决问题。

重要

该文件位于内部存储库中,该存储库不可公开访问,如果您的存储库可公开访问,请假定您需要还原的所有内容已被其他人拉下。