如何在某个路径下自动解决多个git冲突?

如何在某个路径下自动解决多个git冲突?,git,merge-conflict-resolution,git-merge-conflict,Git,Merge Conflict Resolution,Git Merge Conflict,将分支源合并到目标时,我会遇到~1K个冲突,我注意到以下几点: 路径MyRepo\SomeFolder\A\下的所有冲突文件都应从源分支中选取。例如,“MyRepo\SomeFolder\A\File1.txt,MyRepo\SomeFolder\A\File2.script” 路径MyRepo\SomeFolder\B\下的所有冲突文件都应从目标分支中选取。例如,“MyRepo\SomeFolder\B\File3.csproj、MyRepo\SomeFolder\B\File4.txt” 来

将分支源合并到目标时,我会遇到~1K个冲突,我注意到以下几点:

  • 路径MyRepo\SomeFolder\A\下的所有冲突文件都应从源分支中选取。例如,“MyRepo\SomeFolder\A\File1.txt,MyRepo\SomeFolder\A\File2.script”
  • 路径MyRepo\SomeFolder\B\下的所有冲突文件都应从目标分支中选取。例如,“MyRepo\SomeFolder\B\File3.csproj、MyRepo\SomeFolder\B\File4.txt”
  • 来自其他路径的少量文件应该通过从源代码和目标代码中选取部分代码来手动解析
  • 子弹3我可以手动解决。存储桶1中的冲突数。二,。是巨大的。是否有一种方法可以运行批处理脚本/命令来解决1/2中的所有冲突

    类似于(伪代码):

    路径中的Foreach文件
    如果文件冲突/包含“,那么这里需要一种方法来调用来自每个冲突合并的三个输入文件的
    git merge file
    。(这是Mercurial现有工具优于Git的一个领域,因为它内置了这种工具。)

    如果有这样的工具,您将:

    • 列出文件名
    • 将列表分为三部分:“自动我们的”、“自动他们的”和“手动”
    • 使用此工具(使用您指定的选项运行
      git merge file
      ,但在这三个输入文件上运行)和
      --ours
      --theres
      ,然后
      git add
      -s结果
    • 手动解析其余文件
    这个工具几乎存在:
    gitmergetool
    包含了正确调用该工具所需的所有机制,但是
    gitmergetool
    本身相当复杂。很难将其修改为所需的工具

    可以通过依靠
    gitshow
    从git的索引中提取三个文件中的每一个,一次提取一个,来构建应该存在的工具的模拟。给定冲突文件F,Git的索引中现在有三个F副本。F的合并基础版本在
    :1:F
    中,
    --我们的
    版本在
    :2:F
    中,
    --他们的
    版本在
    :3:F
    中。但这可能无法正确解释文件重命名操作。最好像mergetool代码那样使用
    git checkout index

    要获取未合并文件的列表,请使用
    git ls files-u
    。(请注意,这将启用
    --stage

    要运行
    git合并文件
    ,请将每个文件的三个输入的签出副本(即可用的纯文本文件)馈送给它。添加所需的合并选项(
    --我们的
    --他们的
    ;如果您正在使用该工具,允许
    --联合
    也可能是合理的)以自动解决冲突。然后,考虑做<代码> Git CytoTooO[/COD> >的其余部分:自动<代码> Git添加< /代码>结果。


    为此编写实际工具只是一个练习。

    您可以使用
    git checkout--ours/--theres--directory/path

    它将仅为冲突文件更改磁盘上文件的内容,并且仍会将文件列为冲突文件,因此您可以检查内容是否符合您的喜好,如果您意识到选择了错误的一方,则可以运行
    git checkout--[另一方]

    如果您意识到需要返回文件或目录的冲突内容,可以运行:

    git checkout -m -- file/or/directory
    

    如果你所说的来源和目标是指:

    # from branch Target :
    git checkout Target
    
    # you are merging Source :
    git merge Source
    
    然后:

    • Source
      --他们的
    • 目标
      ——我们的
    要运行的命令将是:

    git checkout --theirs -- SomeFolder\A
    git checkout --ours -- SomeFolder\B
    

    如果您对
    SomeFolder\A
    的内容满意,请运行
    git add SomeFolder\A
    以删除冲突状态并将其暂存以提交


    正如@torek所指出的,缺点是您将无法再访问
    --他们的/--我们的/-m
    版本。

    您应该能够使用
    git解决冲突
    做您想做的事情。这是由编写的git合并文件的小型包装器。您可以将其作为脚本从

    或者使用

    npm install -g git-resolve-conflict
    
    它只是一个小的bash脚本,可以让您使用给定的策略(cmp.)更轻松地解决特定文件的合并冲突

    要以特定方式对子目录中的所有文件执行此操作,可以执行以下操作

    for ITEM in $(git diff --name-only --diff-filter=U | grep `SomeFolder/A/); do git-resolve-conflict --theirs $ITEM; done
    for ITEM in $(git diff --name-only --diff-filter=U | grep `SomeFolder/B/); do git-resolve-conflict --ours $ITEM; done
    

    如果您使用unix-y shell,这在Windows下也会起作用,例如
    Git Bash

    想法:如果提交可以一次分解为一个目录的提交,那么您可以使用我们/他们的目录。当然,您最终会得到多个合并提交。。。
    for ITEM in $(git diff --name-only --diff-filter=U | grep `SomeFolder/A/); do git-resolve-conflict --theirs $ITEM; done
    for ITEM in $(git diff --name-only --diff-filter=U | grep `SomeFolder/B/); do git-resolve-conflict --ours $ITEM; done