我有我在网上创建的第一个git存储库,名为:
myName / python-algorithms
包含许多python脚本。我尝试使用以下命令从本地Ubuntu终端添加文件test.py:
git init
git config user.name "myName"
git config user.e-mail "[email protected]"
git add test.py
git commit -m "some init msg"
git remote add origin https://github.com/myname/Python_Algorithms.git
git remote -v
git push -f origin master
删除了我所有的python脚本,并用文件test.py替换了它们
知道如何恢复已删除的脚本吗?
因此,有几种方法可以修复不希望的提交。看来您本地的git回购中没有远程回购中的所有信息,这导致您进行了覆盖。在您的终端中,使用git log查看本地git的提交历史记录。如果它仅列出您的测试提交,则我们需要以另一种方式找到最后一个好的提交(所有文件仍然存在的地方)。
转到您的github并导航到您的提交历史记录。您应该在最后一次推送“ some init msg”之前看到一次提交,该提交覆盖了您的其他文件。它将在右侧具有一个十六进制标识符(蓝色)。复制它!
从git终端,您要使用以下命令:git checkout copyedhex#
这会将包含所有文件的版本复制到本地仓库。但是,您将处于分离的HEAD状态,并且应该收到一条消息来说明这一点。您需要使用以下方法将其放入新的分支中:git checkout -b some_new_branch_name然后,您可以照常进行操作(将其与主对象合并,或者继续单独工作,继续推等)
此处有更多帮助信息:https://www.atlassian.com/git/tutorials/undoing-changes
希望有帮助!
知道如何恢复已删除的脚本吗?
主要方法:查找原始存储库的备份副本/克隆(或乞求GitHub管理员找到一个)。>>
一种临时方法:如果您的哈希ID显示在窗口中的某个地方或写在纸或白板上的某个地方,并且可以导航to
提交的GitHub URL(例如https://github.com/git/git/commit/b9e62f60115c75c5be5de593862925c8b8d7e683是URL对于该特定Git(用于Git)的Git存储库中的GitHub上的特定提交),可通过单击“浏览文件”将其用于获取tree对象,然后将其用于获取文件。您可以在有限的时间范围内执行此操作;之后,GitHub的维护检查器将删除提交,并且除非通过备份副本或其他克隆,否则将无法恢复。请记住,Git存储的是commits
。每个提交都拥有您所有文件的完整完整快照,以及有关该提交的某些metadata:信息,例如创建者和时间。每个提交都具有唯一的哈希ID,因此任何Git存储库都可以仅通过检查哈希ID来立即判断它是否具有该提交。如果存储库具有带有that哈希ID的提交,则它具有that commit。同时,当然,每个repository
都拥有一些提交。您的GitHub存储库中有一些提交,其中包含您的文件。创建新的空存储库时:
。没什么大不了的,因为您可以进行新的提交:git init git config user.name "myName" git config user.e-mail "[email protected]"
此新的空存储库具有完全没有提交
个提交。让我们画一下。它有一些丑陋的哈希ID,但我们称它为“哈希”git add test.py git commit -m "some init msg"
此新存储库现在具有one
H
:存储库中的第一个提交因此不会指向任何地方:H <-- master
同时,
https://github.com/myname/Python_Algorithms.git
处的GitHub存储库还有其他提交。假设它有四个提交,并将它们称为A
,B
,C
和D
。它的master
保存提交D
的哈希ID,该ID指向提交C
,指向B
,指向A
,这是that
A <-B <-C <-D <-- master (in the Git on GitHub)
运行
git push
时无
-f
:做的事情:]git remote add origin https://github.com/myname/Python_Algorithms.git git remote -v
[和您没有
git push origin master
您的Git会调用该其他Git,并向您提供您的一次提交,您已经拥有而他们没有。到目前为止,一切都很好:他们接受了一次提交并将其放入隔离区。然后,您的Git对他们的Git说:请,如果可以,请使用此提交的哈希ID设置您的分支名称
master
。
他们的Git在其存储库中查找,该存储库具有一连串以D
结尾的提交链。它尝试向后跟随提交H
,以查看是否可以使它提交D
。但是提交H
具有no
A
。因此,H
没有返回到D
,GitHub响应了您的Git:否!如果我用提交哈希master
覆盖了我的名字H
,我将丢失提交D
,因此,所有先前的提交也将丢失!A,您告诉Git到git push -f origin master
,并添加了[[force
master
!GitHub上的Git服从。他将master
设置为指向H
:A--B--C--D [abandoned]
H <-- master
目前,普通的Git机制无法访问GitHub存储库中的旧提交。最终,他们的Git维护/管理员处理将出现,并永久清除原始提交链。在此之前,通过提交.../commit/<hash>
URL通过直接URL访问将绕过常规的Git机制,因此它仍然可以工作。但是所有常规的Git操作都因为它们的master
现在指向提交H
而被挫败,并且他们的Git无法find
D
。[您或其他人可能制作了其他一些包含提交D
的克隆(如果这样,它也可能同时具有A
至C
,或者可能只有A
至[C0 ],因为它在添加C
之后再也没有更新过。如果可以找到这样的存储库,并且可以通过哈希ID或D
之类的名称访问其提交,则可以通过这些提交以这种方式获取文件。如果还不行,那就是master
很危险的原因!