我有以下场景:我在一个分支上做了几个提交,然后我使用了一个工具,它在新分支上从UML模型生成代码。不幸的是,这个工具相当愚蠢,不能很好地支持往返生成。因此,我的所有代码都被删除了,只保留了生成的骨架。
我想通过保留文件的两个版本中的所有行来合并这两个分支(并且理想地在每个文件上触发mergetool)。
到目前为止我做了什么:
我在工作树的根目录中创建了一个shell脚本:
#!/bin/sh
echo "union merge"
git merge-file --union "${1}" "${2}" "${3}"
exit 1 # trigger merge conflict
创建.gitattributes文件:
**.cpp merge=mytool
**.h merge=mytool
并编辑了我的.gitconfig:
[merge "mytool"]
name = union merge
driver = ./union-merge.sh %A %O %B
我可以检查.gitattributes文件确实为所有文件设置了merge属性:
$ git check-attr -a src/file.cpp customn/appopt.cpp: merge: mytool
然而,我的脚本没有被执行(我添加回声只是为了确保)。相反,执行正常的git合并,留下另一个分支的内容。我该怎么做呢?
编辑:更多信息:
这是历史
A --- B ------- D (master) \ / ---C--- (toolbranch)
在 B ,我已经提交了更改。我从那里创建了一个新的分支,使用上面提到的代码生成器来生成方法骨架(以及它所使用的一些标记注释)。此步骤已删除我在 B 的更改,因为之前的模型基于 A ,我在toolbranch上提交了此代码。现在我想合并回主并保留 B 和 C 中的内容,以便能够手动将我的实现插入到方法骨架。这里的问题是git不会将此视为冲突,因为它认为在提交 C 中,合法地删除了行并插入了新的方法框架。
答案 0 :(得分:0)
嗯,我不确定我的问题是否正确,但基本上合并时不会自动执行mergetool
。
标准工作流程是您创建git merge
,然后在发生冲突时git会告诉您相关信息,以便您决定如何解决问题。然后,如果您说git mergetool
,它会询问您使用哪个工具来解决它。如上所述设置union-merge
后,只需要一个简单的ENTER
即可调用您的脚本并自定义处理这些文件。