如何恢复初始git提交?

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

# git reset --hard HEAD~1

我得到了这样的信息:

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

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

165739 次浏览

在问题中规定的条件下:

  • 提交是存储库中的第一次提交。
  • 表示执行的命令很少:
    • git init,
    • 假设是一些git add操作,
    • git commit
    • 这就是全部!
    • 李< / ul > < / >

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

    rm -fr .git
    

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

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

    它会永久且不可恢复地删除Git存储库目录,除非你在某个地方有备份。在前提条件下,您不需要在存储库中保留任何东西,因此不会丢失任何东西。 您添加的所有文件在工作目录中仍然可用,假设您还没有修改它们,也没有删除它们,等等。但是,只有在存储库中没有其他内容时,这样做才安全。在问题“第一次提交存储库—那就后悔吧,这是安全的。

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

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

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

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

rm -rf .git
git init

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

git update-ref -d HEAD

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

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将重写你在第一步重置的commit

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

你可以删除HEAD并将你的存储库恢复到一个新的状态,在那里你可以创建一个新的初始提交:

git update-ref -d HEAD

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

git push --force origin

这个问题的链接来自这篇博文,并且针对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),而删除和创建一个新的分支会破坏它。由于您希望回到没有历史记录的原始状态,您可能希望删除分支,但其他人可能希望考虑这个小注释。

从技术上讲,要恢复最初的提交,你需要做:

git revert HEAD

但是,由于这记录了一个新的提交,它会逆转上次提交的影响,您不妨自己进行一个新的提交,以修复最初提交所引入的问题。这样,您就可以保持最初的提交(即,您可以保持历史记录不变),这是您可能想要做的(特别是如果,例如,您已经推送到共享存储库)。否则,你可能更愿意重新开始。即删除存储库并创建一个新的存储库

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

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

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

这就解决了问题。

重要< em > < / em >

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

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

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

对我来说:

git update-ref -d HEAD
git rm --cached . -r

第一行是CB Bailey建议的(不确定为什么第二行是必要的,但git直到我这样做了才取消提交文件-我可以通过在上面的第二行前后运行git status来判断)

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

git update-ref -d HEAD

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

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

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

git rm --cached . -r

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

现在可以快速执行git status来确认暂存区域现在是空的。

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

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

在这种情况下,下一个最佳的逻辑解决方案是使用git pushgit push -f将更改推到远程(但是,始终记住强制推是危险的-读取在这里.)。

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

此外:

  • 使用rm -rf .git删除本地git回购,
  • git init重新初始化它,
  • 使用git add -A将所有当前文件添加到暂存区,
  • 使用git commit -m "<commit message>"提交它们,
  • 使用git remote add origin <repo url>添加远程源URL,
  • 最后,使用git push -u origin main再次推入本地文件。

PS:

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

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