如何还原初始git commit?


357

我第一次提交到git仓库;然后,我对提交感到遗憾,并希望将其还原。我尝试

# git reset --hard HEAD~1

我收到此消息:

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

此提交是存储库的第一次提交。任何想法如何撤消git的初始提交?

Answers:


565

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

git update-ref -d HEAD

千万不能使用rm -rf .git或类似这样的,因为这将事情彻底消灭整个仓库在内的所有其他部门以及分公司您尝试重置。


1
git statusgit rebase尝试了这个过程,希望重新分配第一次提交,然后又做了,令我惊讶的是git说fatal: Not a git repository (or any parent up to mount point ...)
马特·芬威克

1
这对我不起作用。制作文件,包括一些应忽略但不存在的文件.gitignoregit add .git commit -m "initial commit"git update-ref -D HEAD,创建.gitignore,通知了Git仍然看到它前面应该忽略添加的文件。换句话说git update-ref -d HEAD,没有使我回到最初提交之前的状态。
gman 2014年

1
但这就是原始问题的重点。回到刚提交前的状态。
gman 2014年

2
git reset --hard HEAD~1将删除所有其他提交的添加文件。显然,问题是如何在其他所有情况下都达到与该命令相同的状态。请参阅此要点以证明您的解决方案不起作用 gist.github.com/greggman/522fa69a21d6cfb3ff0b
gman

11
在任何情况下得到由GMAN的言论感到困惑:git update-ref -d HEAD 没有真正恢复最初的承诺,但一直都添加到索引之前COMMITED变化。如果您还想删除这些更改,只需执行以下命令git reset --hard。即使答案不完整,也确实是最好的答案,因此请避免使用rm -fr .git(除非您知道自己在做什么)。
rsenna

62

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

git update-ref -d HEAD

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

git push --force origin

1
值得注意的是...这是正确的命令,但是它不会删除HEAD ...它会删除.git \ HEAD文件已签出的ref(位于.git \ refs \ heads下)。运行此命令后,您仍然可以找到指向已删除的refs / heads / <name>文件的HEAD文件,但是如果遵循该路径,您将看到head ref不再存在。
DanK

15

这个问题是从这篇博文中链接的,并为较新版本的Git提出了替代解决方案:

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

该解决方案假定:

  1. 您的master分支上只有一次提交
  2. 没有分支叫,old_master所以我可以随意使用该名称

它会将现有分支重命名为,old_master并创建一个新的孤立分支master (就像为新存储库创建的一样),之后您可以自由删除old_master...。由你决定。

注意:移动或复制git分支会在删除时保留其reflog(请参见此代码),然后创建新分支会破坏它。由于您想恢复到没有任何历史记录的原始状态,因此您可能希望删除该分支,但是其他人可能要考虑此小注释。


11

在问题规定的条件下:

  • 提交是存储库中的第一次提交。
  • 这意味着执行的命令很少:
    • git init
    • 大概是一些git add手术
    • 并且git commit
    • 就这样!

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

rm -fr .git

从您执行的目录git init。然后,您可以重做git init以重新创建Git存储库,并在不感到第一次后悔的情况下重做所有有意义的更改,并重做初始提交。

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

除非您有备份,否则它将永久且不可恢复地删除Git存储库目录。在前提条件下,您什么都不想保留在存储库中,因此您不会丢失任何东西。假定您尚未修改它们并且还没有删除它们,等等,所有添加的文件仍然在工作目录中可用。但是,只有在您的存储库中什么都没有的情况下,这样做才是安全的。在“第一次提交存储库-然后后悔”问题中描述的情况下,它是安全的。但是,很多时候这并不安全。

执行此操作以删除不需要的克隆存储库也很安全;它不会对从其克隆的存储库造成损坏。它会丢弃您在副本中所做的所有操作,但不会影响原始存储库。

注意,但前提是满足安全性和有效性。

如果您要保存的存储库已经做过其他事情,那么这不是适当的技术-您的存储库不再符合适合此存储的先决条件。


9
这是个坏建议。如果回购中还有其他您不想丢失的东西怎么办?
Matt Fenwick 2014年

5
那就不是最初的提交了。最初只有一次提交。
乔纳森·勒夫勒

9
“那么那不是最初的提交” –实际上,是的。您忽略了多个分支的常见情况。参见查尔斯的答案。
马特·芬威克

2
有用,但是应该带有警告。
Simon Bengtsson

5
这实际上有效。接受的答案不是。查看评论
gman 2014年


3

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

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

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

这样就可以解决问题。

重要

该文件位于无法公开访问的内部存储库中,如果您的存储库是可公开访问的,请假定您需要还原的任何内容已经被其他人拉低。


1

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

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

--author仅在有人纠正提交的作者身份时才需要
理查德

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

--force将重写您在第一步中重置为的提交。

不要这样做,因为您将违背VCS系统的整个想法,尤其是git。唯一好的方法是创建新的并删除不需要的分支。请参阅git help branch以获取信息。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.