我第一次提交到git存储库;然后我后悔提交并想要恢复它。我试着

# git reset --hard HEAD~1

我得到了这样的信息:

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

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


当前回答

我想知道为什么@damkrat不建议使用“修正”,而且已经把它划掉了,因为修正在我看来是最有效地解决修正错误提交的潜在问题的正确方法,因为没有初始提交是没有目的的。正如一些人强调的那样,如果没有人克隆你的repo,你应该只修改“公共”分支…

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

其他回答

在问题中规定的条件下:

提交是存储库中的第一次提交。 这意味着执行的命令非常少: git初始化, 大概是一些git添加操作, git提交, 这就是全部!

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

rm -fr .git

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

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

It removes the Git repository directory permanently and irrecoverably, unless you've got backups somewhere. Under the preconditions, you've nothing you want to keep in the repository, so you're not losing anything. All the files you added are still available in the working directories, assuming you have not modified them yet and have not deleted them, etc. However, doing this is safe only if you have nothing else in your repository at all. Under the circumstances described in the question 'commit repository first time — then regret it', it is safe. Very often, though, it is not safe.

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

要小心,但当前提条件满足时,它是安全有效的。

如果您已经对存储库做了其他想要保留的事情,那么这不是合适的技术—您的存储库不再满足合适的前提条件。

Git重置——很难 做出改变,然后去做

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

or

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

然后

git push origin master --force

——force将重写你在第一步重置的commit。

不要这样做,因为你将违背VCS系统,特别是git的整个思想。唯一好的方法是创建新的分支并删除不需要的分支。详见git帮助分支。

一种选择是删除存储库并创建一个新的存储库:

rm -rf .git
git init

要恢复初始提交,请使用下面的命令。

git update-ref -d HEAD

完成之后,未提交的文件现在位于暂存区域。你可以通过git status命令确认这个分段状态,你会得到一个类似于下面截图的结果。

暂存区中未提交的文件显示为黄色

Git建议使用命令的语法取消存在问题的文件(参见上图)。简而言之,使用下面的命令:

git rm --cached . -r

命令中的点(.)表示当前位置/dir,而标志-r递归地取消文件的阶段,而不提示每个文件的确认。

您现在可以执行一个快速的git状态来确认暂存区域现在是空的。

如果您已经将文件推到远程回购,下一步是将这些更改推到远程回购,以恢复两者(本地和远程)之间的奇性。

但是,在推送之前,创建一个.gitignore文件,并用不必要的文件填充它。在这里阅读如何创建.gitignore文件。

在这个关键时刻,下一个最佳的逻辑解决方案是使用git push或git push -f将更改推到远程(但是,永远记住强制推是危险的-阅读这里。)

但是,这两个push命令都可能返回错误,这可能需要一个push命令进行拉取并解决合并冲突。所以为了避免这种麻烦,你可能只需要删除整个远程回购(在GitHub上有这些说明),然后用相同的名称重新创建它。

此外:

使用rm -rf .git删除本地git repo, 用git init重新初始化它, 使用git add -A将所有当前文件添加到暂存区, 使用git Commit -m "<提交消息>", 用git remote add origin <repo URL > 最后,使用git push -u origin main再次推送本地文件。

PS:

有很多原因需要恢复第一次提交。然而,我认为同样影响我的一个最常见的原因是忘记添加一个.gitignore文件,该文件可以从提交中排除不必要的文件。在我的例子中,这个错误意味着我无意中将node_modules目录推到了远程存储库。

经过进一步的研究,我发现了一篇技术文章,解释了一种更简单的方法来忽略先前提交的文件,它不需要经历乏味的取消提交和删除远程回购的过程。

我会把最后对我有用的东西讲出来。 我需要删除存储库上的初始提交,因为隔离的数据被放错了地方,提交已经被推送。

确保你现在在正确的分支上。

Git checkout master

git update-ref -d HEAD

git commit -m初始提交

Git push -u origin master

这就解决了问题。

重要的

这是一个内部存储库,它是不可公开访问的,如果你的存储库是可公开访问的,请假设你需要恢复的任何东西已经被其他人拉下来。