我有一个在线创建的第一个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
。
您知道如何找回已删除的脚本吗?
答案 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存储库还有其他提交。假设它有四个提交,并将它们称为A
,B
,C
和D
。其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
(如果这样的话,它可能也有A
至C
,或者也许有仅A
到C
,因为它在添加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