【问题标题】:git merge "deleted by us"git merge“被我们删除”
【发布时间】:2021-10-06 05:21:50
【问题描述】:

我正在做一个大合并。 许多文件已从我的分支中的存储库中删除,并且在进行合并时,我希望为所有这些文件保留此更改。 还有一些文件需要显式合并,我打算使用git mergetool 来合并它们。

我希望保留所有已删除文件的“已被我们删除”更改(即文件应保持删除状态)。我想自己解决的其他合并冲突。
有没有办法告诉 git 保持删除的文件被删除?

【问题讨论】:

  • git rm 在合并过程中应该可以解决问题。
  • 本地删除了多少文件,远程没有删除?
  • @Amber: git rm 为每个文件提供输出“(文件名):需要合并”。
  • @TimBiegeleisen:1082 个文件
  • @user1290746 你可以看看git checkout --ours <paths...> 是否有效。

标签: git merge


【解决方案1】:

这里是部分解决方案:

  1. 手动解决所有未删除的合并冲突,无论如何您都必须这样做

  2. 键入git diff --name-only --diff-filter=U 以获取所有剩余冲突文件的列表。这些文件必须是您要删除的文件。将删除的文件列表保存为filesToRemove.txt

  3. 然后执行cat filesToRemove.txt | xargs git rm 删除所有文件。

【讨论】:

  • 如果你确信来自 git diff 命令的列表是正确的,你可以跳过临时文件,直接运行git diff --name-only --diff-filter=U | xargs git rm
【解决方案2】:

一行修复:

git diff --name-only --diff-filter=U | xargs git rm

解释:

先解决冲突的修改文件并将其添加到暂存区,然后使用diff-filter删除剩余的未合并文件。这里是文档(man git-diff):

   --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]

仅选择已添加 (A)、已复制 (C)、已删除 (D)、已修改 (M)、重命名 (R) 的文件,具有其类型(即常规文件、 符号链接,子模块,...)已更改(T),未合并(U),未知 (X),或有过他们的 配对损坏 (B)。可以使用过滤字符的任意组合(包括无)。添加 *(全有或全无)时 对于组合,如果有任何文件,则选择所有路径 符合其他条件 比较;如果没有符合其他条件的文件,则不选择任何内容。

此外,这些大写字母可以小写以排除。例如。 --diff-filter=ad 排除添加和删除的路径。

请注意,并非所有差异都可以包含所有类型。例如,从索引到工作树的差异永远不会有 添加条目(因为 diff 中包含的路径集是 受限于索引中的内容)。 同样,如果禁用了对这些类型的检测,则无法显示复制和重命名的条目。

【讨论】:

  • 当您必须多次按下同一个键时,您可以将输出从yes d 传送到git rm
  • 这是不正确的,因为它会删除所有冲突的文件——不仅是我们删除的,还有修改过的等等。
  • 理想情况下,您希望先解决冲突,然后再删除 diff 中的文件。帮助您捕获错误并查看需要什么。您可以随时阅读手册并根据需要进行修改:--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]:仅选择符合以下条件的文件添加(A),复制(C),删除(D),修改(M),重命名(R),其类型(即常规文件,符号链接,子模块,...)更改(T),未合并(U )、未知 (X) 或配对已损坏 (B)。可以使用过滤字符的任意组合(包括无)。
【解决方案3】:

您可以通过将编辑后的文件添加回去并再次提交来解决此问题:

git add .

git add -A

然后提交

git commit

如果您想通过删除文件来解决冲突,您必须运行 git rm 而不是 git add

见:Resolving a merge conflict from the command line

【讨论】:

    【解决方案4】:

    我会留下这个问题 - 因为我确信有一个很好的答案 - 这就是我在此期间所做的:

    1. git status 可查看已删除文件的列表 (1082) 和合并冲突的数量 (3)
    2. 在文本编辑器中手动编辑 3 个有合并冲突的文件,然后对它们执行git add
    3. 创建一个文本文件,每行带有字母“d”,对于已删除的每个 (1082) 个文件 (d.txt),没有其他内容
    4. 运行git mergetool < d.txt

    不优雅,但比按字母“d”输入1082次要快

    【讨论】:

    • 我现在正在与完全不同的事情作斗争,当我意识到你在写这个答案之前计算了你按 Enter 的次数时,我笑了。如果这是在 reddit 上,我会给你一枚金币
    【解决方案5】:

    我也观察到了

    abc.txt:需要合并

    尝试时

    git rm abc.txt
    

    挑选后看到文件处于“已被我们删除”状态。

    通过执行以下操作,我最终解决了删除问题:

    git add abc.txt
    rm abc.txt
    git add abc.txt
    

    这会将 abc.txt 添加到暂存区域(本质上是重新创建“被我们删除”文件。(解决冲突状态)

    然后从文件系统中删除文件

    然后在声明区域中添加文件现已消失的事实。

    可能有一些 shell 技巧可以在您的 1000 多个文件上运行这 3 个命令而不会让人头疼。

    可能有更好的方法来处理这个问题,但是由于git rm abc.txt 没有按照我们对我们的情况的预期工作,我想我会分享一组替代命令,这些命令似乎在不使用 的情况下有效合并工具

    【讨论】:

      【解决方案6】:

      首先,启动合​​并以进入冲突状态。

      然后试试这个:

      git status | grep 'deleted by us' | sed 's/deleted by us: //' | xargs git rm
      

      如果您对它的工作原理感到好奇,您可以事先以命令方式构建它:

      git status
      git status | grep 'deleted by us'
      git status | grep 'deleted by us' | sed 's/deleted by us: //'
      

      另请参阅 git statusgrepsedxargs 的手册页。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-27
        • 2017-06-29
        • 2017-01-20
        • 2016-01-15
        • 2012-07-18
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多