推送到GitHub远程存储库后删除的文件

时间:2020-02-15 18:43:25

标签: git git-push git-remote

我有一个在线创建的第一个Git存储库,名为myName/python-algorithms

它包含许多Python脚本。我尝试使用以下命令从本地Ubuntu终端添加文件test.py

git init
git config user.name "myName"
git config user.e-mail "myEmail@myEmail.se"
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脚本,并在GitHub上将其替换为文件test.py

您知道如何找回已删除的脚本吗?

3 个答案:

答案 0 :(得分:1)

因此,有几种方法可以修复不希望的提交。看来您本地的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

希望有帮助!

答案 1 :(得分:1)

您知道如何找回已删除的脚本吗?

主要方法:查找原始存储库的备份副本/克隆(或乞求GitHub管理员找到一个)。

一种临时方法:如果您的哈希ID显示在窗口中的某个地方或写在纸上或白板上的某个地方,并且可以导航该提交的GitHub URL(例如{ 3}}是该特定Git Git存储库中GitHub上某个特定提交的URL),通过单击“浏览文件”使用它来到达 tree 对象,并使用该URL来访问您的文件。您可以在有限的时间范围内执行此操作;之后,GitHub的维护中心将删除提交,并且除非通过备份副本或其他克隆,否则将无法恢复。


请记住,Git存储的是 commits 。每个提交都拥有您所有文件的完整和完整快照,以及有关该提交的某些 metadata:信息,例如创建者和创建时间。每个提交都具有唯一的哈希ID,因此任何Git存储库都可以仅通过检查哈希ID来立即判断它是否具有该提交。如果存储库具有带有那个哈希ID的提交,则它具有那个提交

同时,当然,每个存储库都包含一些提交。您的GitHub存储库中有一些提交,其中包含您的文件。

创建新的空存储库时:

git init
git config user.name "myName"
git config user.e-mail "myEmail@myEmail.se"

这个新的空存储库根本没有提交。没什么大不了的,因为您可以进行新的提交:

git add test.py
git commit -m "some init msg"

此新存储库现在具有一个提交。让我们画一下。它有一些丑陋的哈希ID,但我们称其为“ {hash”的H

H   <-- master

与此同时,位于https://github.com/myname/Python_Algorithms.git的GitHub存储库还有其他提交。假设它有四个提交,并将它们称为ABCD。其master拥有提交D的哈希ID,该ID指向提交C,指向B,指向A,该{ 那个存储库中的第一次提交,因此没有指向任何地方:

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 标志。强制标志将您的Git的礼貌请(如果可以)请求更改为命令:设置您的master

GitHub上的Git服从了。他将master设置为指向H

A--B--C--D   [abandoned]

H   <-- master

此时,常规Git机制无法访问GitHub存储库中的旧提交。最终,他们的Git维护/管理员程序将出现,并永久清除原始提交链。在此之前,通过.../commit/<hash> URL通过直接URL访问将绕过常规的Git机制,因此它仍然可以工作。但是所有常规的Git操作都因为它们的master现在指向提交H而受到挫败,并且他们的Git无法找到提交D

您或其他人可能创建了一些其他克隆,其中包含提交D(如果这样的话,它可能也有AC,或者也许有仅AC,因为它在添加D之后再也没有更新过。如果您可以找到这样的存储库,并且可以通过哈希ID或master之类的名称来访问其提交,则可以从这些提交中以这种方式获取文件。如果没有...那么,这就是git push --force很危险的原因!

答案 2 :(得分:0)

已修复:感谢torek评论,我将其修复如下。发件人:

 <button id='cit"+i+"' onclick='doThing_chemistry(event);show_col();'>"+i+"</button>

在强制执行之前,我找到了旧的HASH_ID。然后我转到了链接:

https://api.github.com/repos/myName/Python_Algorithms/events

我管理了浏览文件,然后又回到了文件。

感谢torks

相关问题