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



前言

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

问题

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

每次发现时,我首先做了一个

git pull [my_repo] master

然后一个

git push [my_repo] master

在第二次迭代之后(当我认为我只向 .gitignore 添加了内容时(,我收到一个错误,指出我在需要合并的文件方面遇到了一些问题。我首先在gitHub上创建了.gitignore,这是不同的,我认为这是问题所在并开始合并。

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

我试过git reset --hard master,重置时一切都是一样的。

谁能阐明这一点? 可能的解决方案?

似乎找不到类似的问题;虽然,我想我不可能是第一个这样做的人。

编辑:

TL;DR 版本:

如果在存储库中找到要被 git 忽略的文件:

  1. 仅将其从 git 存储库中删除

    git rm --cached filesToIgnore

  2. 放置文件或通配符规则(例如 *.swp ( 在.gitignore文件中。然后使用git commit保存存储库

好吧,我还没有完全拼凑在一起,但让我们分解一下出了什么问题:

第一。 .gitignore.git/info/exclude 之间没有区别,只是前者被签入存储库并用于忽略项目特定文件,而后者用于特定于环境的文件,例如与 Vim 临时文件相关的.swp文件。

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

2nd. 使用 git pull 时,它首先对远程仓库执行git fetch,然后尝试合并远程仓库和本地仓库。 为什么这很重要? 因为如果您有任何本地未经检查的文件,它会抱怨。 这是我猜你看到的错误。

第三。由于您强制合并,因此您可能最终会丢弃任何未签入的文件。 这些都消失了。 由于它们从未被签入 git,因此 git 不知道它们。

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

4th. 当你在 git 仓库中找到你想要忽略的文件时,你需要做的是正确的过程是

git rm --cached filesToIgnore

这将从 git 存储库中删除它们,但不从工作目录中删除它们。

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

首先...拿回你的东西。 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不会影响存储库中已有的文件。 有一些古怪的事情正在发生,如果没有完整的历史,几乎不可能准确地拼凑出发生了什么

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

我知道 git 有利于协作,但对于简单的个人项目,我认为这是一种矫枉过正。另外,我认为新来的孩子让事情变得如此复杂。.NET CORE, MVVM, MVM, NPM, VUE, REACT, NODE.JS, arrow functions, etc...

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

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

最新更新