如何恢复初始git提交?

Cha*_*ang 311 git

我第一次承诺使用git存储库; 然后我后悔提交并想要还原它.我试试

# git reset --hard HEAD~1
Run Code Online (Sandbox Code Playgroud)

我收到这条消息:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
Run Code Online (Sandbox Code Playgroud)

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

CB *_*ley 491

您只需要删除您所在的分支.您无法使用,git branch -D因为这样做有安全检查.你可以update-ref用来做这件事.

git update-ref -d HEAD
Run Code Online (Sandbox Code Playgroud)

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

  • 如果有人对gman的评论感到困惑:`git update-ref -d HEAD`**确实**实际上还原了初始提交,但是将所有先前提交的更改保留在索引中.如果你想删除这些更改,只需执行以下`git reset --hard`.即使不完整,这个答案确实是最好的,所以避免使用`rm -fr .git`(除非你知道你在做什么). (9认同)
  • 但这就是原始问题的重点。回到初始提交之前的状态。 (2认同)
  • `git reset --hard HEAD~1`将删除所有其他提交的添加文件.显然,问题是如何进入相同的状态,因为该命令适用于所有其他情况.请参阅此要点以证明您的解决方案不起作用https://gist.github.com/greggman/522fa69a21d6cfb3ff0b (2认同)

fra*_*ras 55

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

git update-ref -d HEAD
Run Code Online (Sandbox Code Playgroud)

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

git push --force origin
Run Code Online (Sandbox Code Playgroud)

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

Cur*_*one 21

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

git update-ref -d HEAD
Run Code Online (Sandbox Code Playgroud)

完成后,未提交的文件现在位于暂存区域中。您可以通过命令确认此暂存状态git status,您将获得类似于下面链接的屏幕截图中的结果。

我在暂存区域中未提交的文件呈黄色

Git 建议使用命令语法来取消暂存相关文件(请参见上图)。简而言之,使用以下命令:

git rm --cached . -r
Run Code Online (Sandbox Code Playgroud)

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

您现在可以快速执行操作git status以确认暂存区域现在​​为空。

如果您已经将文件推送到远程存储库,下一步是将这些更改推送到远程存储库以恢复两者(本地和远程)之间的奇偶校验。

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

此时,下一个最佳的逻辑解决方案是使用 或 将更改推送到远程git pushgit push -f但是,请始终记住强制推送是危险的 - 请阅读此处。)。

然而,这两个推送命令都可能返回错误,这可能需要拉取并解决合并冲突。因此,为了避免这种麻烦,您可能只需删除整个远程存储库(在 GitHub 上使用这些说明),然后使用相同的名称重新创建它。

此外:

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

附:

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

经过进一步研究,我发现了一篇技术文章,解释了一种更简单的忽略先前提交的文件的方法,该方法无需经历取消提交和删除远程存储库的繁琐过程。


non*_*kle 12

此问题与此博客文章相关联,并为更新版本的Git提出了替代解决方案:

git branch -m master old_master
git checkout --orphan master
git branch -D old_master
Run Code Online (Sandbox Code Playgroud)

该解决方案假定:

  1. 您的master分支上只有一个提交
  2. 没有分支,old_master所以我可以自由使用该名称

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

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


Jon*_*ler 10

在问题规定的条件下:

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

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

rm -fr .git
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  • 这是一个糟糕的建议.如果回购中有其他东西你不想丢失怎么办? (8认同)
  • "那么它不会是最初的提交" - 实际上,是的,它会.你忽略了多个分支的常见情况.见查尔斯的回答. (8认同)
  • 然后它不会是初始提交,是吗?只有一个初始提交. (5认同)
  • 这实际上有效.接受的答案没有.见评论 (5认同)
  • 有帮助,但应该有一个警告. (2认同)

ma1*_*w28 7

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

rm -rf .git
git init
Run Code Online (Sandbox Code Playgroud)


小智 7

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

确保您当前位于正确的分支上。

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

这才能够解决问题。

重要的

这是在不可公开访问的内部存储库上,如果您的存储库可公开访问,请假设您需要恢复的任何内容已被其他人拉下。