丢失了我的git repo中的所有文件,重置不起作用。发生了什么?

时间:2013-03-08 16:23:27

标签: git github

前言

我是git的新手,已经在一个项目中使用了几个月,并决定在Github上提供它。我刚刚发现我的备份脚本几乎正常工作,所以我备份了一切,但它很草率。 Pheww ......但我希望是B计划。

问题

我意识到某些netCDF数据文件基本上在版本控制(=巨大的.git存储库)中被复制,所以我试图通过首先添加这些文件扩展名(以及一些测试/数据目录)来排除这些文件到根目录中的.gitignore文件。这似乎只是忽略这些文件的版本控制,但仍然包含在.git存储库中。然后我将它们添加到.git/info/exclude,我相信它完全从存储库中忽略它们。

每次发现,我都先做了一次

git pull [my_repo] master

然后是

git push [my_repo] master

在第二次迭代之后(当我认为我只添加了.gitignore的东西时),我收到一条错误,指出我对需要合并的文件有一些问题。我首先在gitHub上创建了.gitignore,这是不同的,我认为这是问题并开始合并。

在第三次迭代中(向.git/info/exclude文件添加了内容),一切都很顺利,但我看到只有我想要的目录EXCLUDED出现在gitHub上。回到我的磁盘上,其他一切都消失了,包括netCDF数据文件...

我尝试了git reset --hard master,重置时一切都一样。

有人能说清楚吗?可能的解决方案?

我似乎无法找到类似的问题;但是,我想我不可能是第一个做到这一点的人。

3 个答案:

答案 0 :(得分:5)

编辑:TL; DR版本:

如果您在回购中找到了想要被git忽略的文件:

  1. 仅从git存储库中删除它

    git rm --cached filesToIgnore

  2. 将文件或通配符规则(例如*.swp)放在.gitignore文件中。然后使用git commit

  3. 保存存储库

    好吧,我没有将它们全部拼凑在一起但是让我们分解出错:

    第一。 .gitignore.git/info/exclude之间没有区别,除了前者被检入存储库并且是要忽略的项目特定文件,而后者是针对特定于环境的文件,例如.swp文件vim临时文件。

    考虑到这一点,将文件放入.git/info/exclude文件只会忽略新文件,而不是已经存储库的文件(我假设netCDF文件是)

    第二。使用git pull,它首先为远程存储库执行git fetch,然后尝试合并远程存储库和本地存储库。为什么这有关系?因为如果您有任何本地未经检查的文件,它会抱怨。这是我猜你看到的错误。

    第三。由于您强制合并,您可能最终丢弃任何未签入的文件。这些都消失了。因为他们从未被检查过git,所以git不知道他们。

    编辑:但是,正如cHao指出的那样,git提交中的所有先前文件仍然存在。使用git log查看您的存储库,并使用git checkout <checksumNumber>暂时检出其中的任何存储库。使用git reset --hard <checksumNumber>将存储库永久重置为该提交。

    第四。当您发现git存储库中要忽略正确进程的文件时,您需要做的是

    git rm --cached filesToIgnore

    将从git repo中删除它们,但不从工作目录中删除它们。

    然后将它们添加到.gitignore文件中,提交更改,你应该很高兴。

答案 1 :(得分:1)

首先......让你的东西回来。 master现在是您在工作副本,删除和所有内容中看到的内容。您需要还原或重置,具体取决于您是否有其他人撤离此回购。 (如果不这样做,那么它们都可以工作。但重置会为您提供更清晰的更改日志。)

请注意,如果其他人从您的回购中删除了错误的合并,我这样做的方式是个坏主意。但如果你是唯一使用它的人,或者他们还没有注意到......

  • 删除或移动exclude文件。这里的东西显然有些古怪,你需要处理的变量越少越好。
  • git log --summary。查找删除文件的提交。我将在此示例中使用abcd1234。)
  • git reset --hard abcd1234~1在它之前转到提交。 (您不必将整个SHA放入其中;只需消除歧义即可。)

你的东西现在应该回来了。如果您是唯一使用您的仓库的人,则可以安全地git push --force origin master覆盖旧(无效)头部。

如果其他人已撤离回购,则还原提交会导致问题减少。你可以让他们做你刚才做的重置,那就行了......但如果你不知道谁在拉,这是Github上的默认情况,那么。 :P

要恢复,而不是上面的git reset,只需说出git revert abcd1234即可。这将撤消该提交的更改。如果文件以多种方式通过多次提交被删除,请一次性指定它们以使用一次提交还原所有内容。无论哪种方式,你都不再需要推动--force,因为你的本地头仍然是原点的后代。

至于导致这一切的原因......已经在回购中的文件不应该只是消失,期间。 .gitignoreexclude不会影响回购中已有的文件。有一些古怪的事情发生,并且没有完整的历史,几乎不可能把所发生的事情拼凑起来

答案 2 :(得分:0)

我的建议是,完全停止使用 git 或 github 并返回使用老式文件夹,并将文件夹的副本保存在云中,另一个副本保存在 USB 上。

我知道 git 有利于协作,但对于简单的个人项目,我认为它有点矫枉过正。另外,我认为新来的孩子让事情变得如此复杂。 .NET CORE、MVVM、MVM、NPM、VUE、REACT、NODE.JS、箭头函数等...

我记得在 2000 年代初期,我是一名 Microsoft 软件工程师,他遵照书本并根据 Microsoft 最佳实践进行所有编码,然后,一切都变得复杂了,Microsoft 发布了新方法来做同样的旧事情,例如作为 LINQ 来访问数据,当我曾经使用久经考验的企业数据访问应用程序块时。然后他们用模型视图控制器废话而不是 Web 窗体将 ASP.NET 更改为奇怪的东西。然后他们甚至添加了其他前端框架。我理解改变。我知道 IT 是一个不断变化的环境,但我认为为了改变而改变并不是改变的理由。顺便说一句,您知道吗,今天您仍然可以在 UNIX 上运行 30 年前的 UNIX 命令并且它仍然有效!我的问题是,当 6 个月后发布了一些“新”的东西来做同样的事情时,那些拥有大量投资的遗留应用程序的大型企业如何才能做到 20 年来完美的旧遗留应用程序。我认为 IT 就像没有头的鸡一样四处奔波,只是考虑到从终端接收输入的 40 年历史的遗留大型机类似于现代 JavaScript 应用程序今天使用的 API 调用。 40 年前的终端也有“单页应用程序”,虽然不是很花哨,但它们仍然是基于后端遗留应用程序“部分刷新”的一页。

只是我的滑稽而真实的 2 美分