我第一次提交到git存储库;然后我后悔提交并想要恢复它。我试着
# git reset --hard HEAD~1
我得到了这样的信息:
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
此提交是存储库的第一次提交。知道如何撤销git的初始提交吗?
我第一次提交到git存储库;然后我后悔提交并想要恢复它。我试着
# git reset --hard HEAD~1
我得到了这样的信息:
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
此提交是存储库的第一次提交。知道如何撤销git的初始提交吗?
当前回答
要恢复初始提交,请使用下面的命令。
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重置——很难 做出改变,然后去做
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帮助分支。
我会把最后对我有用的东西讲出来。 我需要删除存储库上的初始提交,因为隔离的数据被放错了地方,提交已经被推送。
确保你现在在正确的分支上。
Git checkout master
git update-ref -d HEAD
git commit -m初始提交
Git push -u origin master
这就解决了问题。
重要的
这是一个内部存储库,它是不可公开访问的,如果你的存储库是可公开访问的,请假设你需要恢复的任何东西已经被其他人拉下来。
要恢复初始提交,请使用下面的命令。
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 branch -D,因为这样做有一个安全检查。您可以使用update-ref来做到这一点。
git update-ref -d HEAD
不要使用rm -rf .git或类似的东西,因为这将完全擦除你的整个存储库,包括所有其他分支,以及你试图重置的分支。
这个问题的链接来自这篇博客文章,并且针对新版本的Git提出了一个替代解决方案:
git branch -m master old_master
git checkout --orphan master
git branch -D old_master
该解决方案假设:
在你的主分支上只有一个提交 没有称为old_master的分支,所以我可以自由使用这个名称
它会将现有的分支重命名为old_master,并创建一个新的、孤立的分支master(就像为新的存储库创建的一样),之后你可以自由地删除old_master…与否。由你决定。
注意:移动或复制一个git分支会保留它的reflog(参见这段代码),而删除和创建一个新分支会破坏它。由于您希望回到没有历史记录的原始状态,您可能希望删除分支,但其他人可能希望考虑这个小注释。