Git 在不覆盖文件的情况下拉取

Git pull without overwriting files

我有一个项目,但有些文件很大,在/data/guilds/*,我没有提交。

我如何git 获取所有最新代码,但不删除不存在的文件? /data/guilds实际源中不存在,拉取时应该不受影响

当我尝试 git 拉取时,我得到了这个:

error: Your local changes to the following files would be overwritten by merge:
        data/guilds/500785463624335390.json
        data/guilds/611278159555461180.json
        data/guilds/684492926528651336.json
        data/guilds/753312192165838938.json
        data/stats.json

可能不会提交这些文件,但 某人 确实。他们在一些提交中。特别是,它们存在于您要求 Git 合并的提交中。

如果您想避免使用它们,请先避免使用 git pull,因为这意味着 运行 git fetch,然后再 运行 Git 命令。第二个命令由您决定,但通常必须是 git mergegit rebase 之一。如果您不自己做出选择(无论是明确选择还是通过设置自己的默认设置),Git 将使用的默认设置是 运行 git merge.

git merge 命令使用 三个 提交:

  • 合并基础提交,其中包含您和他们(无论“他们”是谁)在您开始时拥有的所有文件,提供新的提交;
  • 您当前的提交,从您当前分支的顶端开始;
  • 他们最近的提交,你告诉你自己的 Git 合并。

在这种情况下,发生的事情是有人——无论是谁提交了你要求 Git 合并的人——从那个共同的起点开始将这些文件添加为新文件。您还没有将它们添加到 您的 提交中,但是他们已经将它们添加到他们的.

为了 Git 合并您当前的提交状态——缺少这些文件;他们只是在你的工作树中,而不是在你当前的提交中——他们的工作需要Git创建这些文件从头开始,包含您告诉 Git 合并的提交中存在的数据。如果 Git 这样做,这将清除那些未跟踪的文件,将它们替换为您要求 Git 合并的提交中的 已跟踪 文件。

您可以按照 Git 的建议(您在此处截取)提交这些文件或将它们移开,但这可能不是正确的做法。不幸的是,没有一件正确的事情可以做。可以说,你可能不得不做几件错误的事情。

同样,问题的根源在于有人提交了这些文件。任何现有提交的任何部分都不能更改:不能由您更改,不能由其他相关人员更改,不能由 Git 本身更改。因此,如果您不想使用这些文件,您 不能使用这些提交 ,至少不能直接使用。

好消息是:您 不必使用这些提交。 只需进行一些 其他 提交 比那些提交更好。请改用这些新的和改进的提交。

坏消息是,要进行这些新的和改进的提交,您将需要另一个工作场所,您需要将当前的数据文件移出方式,因为您不能直接处理提交。 所有 提交都存储在一种特殊的、只读的、Git-only 格式中,这种格式对做任何实际工作都是无用的。出于这个原因,Git 不会让你直接 处理提交。相反,Git extracts 提交到一个工作树中,在那里你有文件,而不是提交。您可以使用文件。 文件 让您完成工作。 (提交没有。)因此,您可以接受其他人提交的具有这些文件的其他提交,并将所有这些文件提取到工作树中。

如果您将这些文件提取到您自己的主要工作树,这显然会破坏您当前的文件。因此,要么将它们保存在当前(主要)工作树之外的某个地方,要么在你自己的主要工作树之外的某个地方进行这项工作:

  • 您可以在新的克隆中完成这项工作,作为一个单独的克隆,它将有自己的工作树、自己的分支、自己的 origin,等等。

  • 或者,您可以使用 git worktree add 添加位于新分支上的 新工作树 。这在某些方面稍微复杂一些,而在其他方面则简单一些。

无论如何,一旦你有一个工作区域,你就可以从他们的提交开始,修复它,使其缺少should 缺少,从 that 文件集做一个 new 提交,现在你有一个新的提交添加到他们的分支适合与 git merge 一起使用,这样您就可以合并 that 提交到 your 分支。

请注意,这并不能修复他们自己的错误。他们的提交(包含这些文件)仍然存在。您将需要他们(无论他们是谁)来接受省略这些数据文件的新更改。当他们确实选择了它时,此更改将删除他们的数据文件!他们将需要恢复它们——可能是从包含它们的提交中恢复——然后开始像你一样工作,使用这些作为他们不添加和提交的未跟踪文件。

为确保他们以后不会再次添加和提交这些数据文件,一旦他们纠正了错误,他们(和您)就可以使用 .gitignore 文件。这不会修复任何旧的提交!旧提交 无法修复 。任何现有提交的任何部分都不能更改。你和他们可以简单地避免使用旧的提交。