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

问题描述 投票:1回答:2

我有我在网上创建的第一个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-commit git-push git-remote
2个回答
0
投票

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

希望有帮助!


0
投票

知道如何恢复已删除的脚本吗?

主要方法:查找原始存储库的备份副本/克隆(或乞求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]"

此新的空存储库具有完全没有提交

。没什么大不了的,因为您可以进行新的提交:
git add test.py
git commit -m "some init msg"

此新存储库现在具有one

个提交。让我们画一下。它有一些丑陋的哈希ID,但我们称它为“哈希” H
H   <-- master

同时,https://github.com/myname/Python_Algorithms.git处的GitHub存储库还有其他提交。假设它有四个提交,并将它们称为ABCD。它的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

标志。强制标志将您的Git的礼貌请,如果可以的话请求更改为命令:设置您的masterGitHub上的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的克隆(如果这样,它也可能同时具有AC,或者可能只有A至[C0 ],因为它在添加C之后再也没有更新过。如果可以找到这样的存储库,并且可以通过哈希ID或D之类的名称访问其提交,则可以通过这些提交以这种方式获取文件。如果还不行,那就是master很危险的原因!
© www.soinside.com 2019 - 2024. All rights reserved.