如何恢复初始git提交?

问题描述 投票:279回答:8

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

# git reset --hard HEAD~1

我收到这条消息:

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

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

git
8个回答
460
投票

您只需要删除您所在的分支。您不能使用git branch -D,因为这样做有安全检查。你可以使用update-ref来做到这一点。

git update-ref -d HEAD

不要使用rm -rf .git或类似的东西,因为这将完全擦除整个存储库,包括所有其他分支以及您尝试重置的分支。


52
投票

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

git update-ref -d HEAD

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

git push --force origin

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的分支,所以我可以自由使用该名称

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

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


9
投票

在问题规定的条件下:

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

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

rm -fr .git

从您执行git init的目录。然后,您可以重做git init以重新创建Git存储库,并重新添加任何您认为没有第一次做出的明智的更改,并重做初始提交。

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

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

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

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

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


3
投票

你不能。所以:

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

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


0
投票

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

git revert {commit_id}'

然后推它

git push origin -f

0
投票

我会告诉最终对我有用的东西。我需要删除存储库上的初始提交,因为隔离的数据被错放了,提交已被推送。

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

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

这能够解决问题。

重要

这是在一个无法公开访问的内部存储库中,如果您的存储库是公共可访问的,请假设您需要还原的任何内容已被其他人删除。

© www.soinside.com 2019 - 2024. All rights reserved.