如何在某个路径下自动解决多个git冲突?
将分支源合并到目标时,我会遇到~1K个冲突,我注意到以下几点:如何在某个路径下自动解决多个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” 来
如果文件冲突/包含“,那么这里需要一种方法来调用来自每个冲突合并的三个输入文件的
git merge file
。(这是Mercurial现有工具优于Git的一个领域,因为它内置了这种工具。)
如果有这样的工具,您将:
- 列出文件名
- 将列表分为三部分:“自动我们的”、“自动他们的”和“手动”
- 使用此工具(使用您指定的选项运行
,但在这三个输入文件上运行)和git merge file
或--ours
,然后--theres
-s结果git add
- 手动解析其余文件
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