【问题标题】:Git merge untracked filesGit合并未跟踪的文件
【发布时间】:2022-01-01 22:30:02
【问题描述】:

使用远程添加的本地未跟踪文件执行git-mergegit-pull 时,出现以下错误

error: The following untracked working tree files would be overwritten by merge:

对此有很多问题,但我发现所有问题都想覆盖本地文件。 但是,我想获得一个差异,即合并文件以确保不会丢失任何内容。

我怎样才能自动实现这一点, 不逐个处理文件?

【问题讨论】:

  • Git 无法合并未跟踪的文件,需要先提交。正如 git 所指出的,如果您尝试合并具有这些文件的分支,但它们当前在您签出的分支上未跟踪,那么合并到另一个分支将覆盖这些文件。如果您想从要合并的分支中合并这些文件,请首先将它们提交到您已签出的分支上,这样它们就不会再被跟踪了。

标签: git diff git-merge git-untracked


【解决方案1】:

Git 中的合并需要三个——而不仅仅是两个——文件:

  • 有一个“基本文件”:这是您和他们(无论他们可能是谁)的起点。
  • 这是您的文件:无论基础文件和您的文件有什么不同,这些都是您的更改
  • 有他们的文件:无论基础文件和他们的文件之间有什么不同,这些都是他们的更改

如果您的工作树中有一个未跟踪的文件,并且他们的提交中有一个同名的文件,那就是您的文件和他们的文件。基础文件在哪里?

git merge 命令不会组成一个,但您可以执行以下操作:

  1. 将文件版本保存在某处(可能在工作树之外,或将文件从foo 重命名为foo.ours);
  2. git merge运行并产生一个新的合并提交(如果需要解决冲突);那么
  3. 为您和他们的文件提供一个基本版本。

您现在拥有三个文件:

  • foo.base: 这个是你自己想出来的。
  • foo:这是他们的文件版本。
  • foo.ours:这是您在开始 git merge 之前拥有的,现在已经完成。

您现在可以:

  1. foo复制到foo.theirs
  2. foo.ours复制到foo
  3. 运行git merge-file foo foo.base foo.theirs

这个git merge-file 使用了和git merge 相同的算法,但是直接取了三个文件。 ours 版本是您首先命名的版本:foo 此处。合并结果会写回这个文件,所以最好使用一个副本,以防 Git 把它弄得一团糟,而你决定重新开始。

请注意,如果您愿意,可以使用 空文件 作为合并基础。但是,如果您这样做,结果通常不是很有帮助。如果您决定这样做,您可以简单地在合并之前添加并提交您的文件git merge 将看到foo 的两个副本都已添加,即,add/add conflict,并做与git merge-file 相关的所有这些大惊小怪的事情。

【讨论】:

  • 感谢您的详尽回答!我刚刚澄清说我正在寻找一种至少是半自动的解决方案,因此我不必单独处理每个文件。从 stderr 中提取文件名似乎很麻烦:/
  • 不幸的是,您必须编写一些代码:使用 git ls-tree -r 读取传入的提交,使用 git ls-files --other 读取未跟踪的文件,编写您自己的代码来组合列表。
【解决方案2】:

我看到了两个选项:

提交未跟踪的文件

  • 提交未跟踪的文件
  • git merge
  • 如有冲突,请处理

将未跟踪的文件移到一边

  • 将未跟踪的文件移到一边(重命名它们或将它们移到其他地方)
  • git merge 将放置新文件。
  • 将您移到一边的文件移回其原始位置。
  • git diff 现在将向您展示您的版本与您刚刚合并的版本之间的差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2015-01-11
    • 2012-01-18
    • 2021-02-13
    • 2021-03-17
    相关资源
    最近更新 更多