强制'git merge'将所有差异声明为合并冲突

时间:2012-04-12 20:48:43

标签: git git-merge

在'git merge'中,我希望任何差异,即使通常不是合并冲突,也可以被视为合并冲突。然后,通过'git mergetool',我可以看到并解决每一个差异。我尝试在.gitattributes中指定'* -merge',但这似乎没有用:

$ git checkout master
Switched to branch 'master'
$ ls
foo.c
$ git merge add-on
Updating a628824..2219552
Fast-forward
  0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar.c
$ cat .gitattributes 
* -merge
$ ls
bar.c   foo.c

对于上面的'git merge add-on',我预计'bar.c'的合并冲突没有基本版本,没有本地版本和远程版本。 [编辑]正如在一个答案中所建议的,上面没有发生合并。这是我强制合并的情况,仍然没有合并冲突:

$ git merge --no-ff add-on
Merge made by the 'recursive' strategy.
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bing.c

请注意,上面的'bing.c'实际上是空的;但是,这不是问题,因为提供非空文件仍然会被合并。 [编辑2]我试过 - 没有提交这个结果:

$ git merge --no-ff --no-commit add-on
Automatic merge went well; stopped before committing as requested
$ git status
# On branch master
# Changes to be committed:
#
#   new file:   boom.c
#
$ git mergetool
No files need merging
$ cat .gitattributes 
* -merge

我错过了什么?有没有办法确认'.gitattributes'是否被使用/读取?

3 个答案:

答案 0 :(得分:7)

你没合并。你的命令git merge add-on执行了“快进”,这意味着它只是移动了分支头。这是因为您的add-on分支已经从master分支的末尾开始,因此不需要合并。如果你运行git log,你会发现没有合并提交。

基本上,它在合并之前看起来像这样:

              master
             /
o---o---o---o           add-on
             \         /
              o---o---o

并且合并只是将master指针移动到该行的末尾:

                          master, add-on
                         /
o---o---o---o---o---o---o

如果您想强制合并,请传递--no-ff标记,如git merge --no-ff add-on中所示。


进一步反思后,merge属性将无法执行您想要的操作。这仅适用于文件级合并,这意味着合并的两端都对特定文件进行了更改。如果只有一方有更改(这是您的情况),则不会进行文件级合并,并且无条件地接受更改的文件。

您最好的选择可能是使用git merge --no-ff --no-commit add-on来生成合并,但实际上并未提交。您现在可以检查结果并在提交合并之前将其调整到令您满意的程度。如果您希望接受基于每个块的更改,您可以执行类似git reset的操作来重置索引,然后执行git add -p来执行每个块的暂存。

答案 1 :(得分:2)

您可能想尝试:

git merge --no-commit

这将使GIT不提交合并更改。或者,如果你希望它在没有冲突的情况下提交,但是不要丢失源分支,那就是no-ff:

git merge --no-ff

必要时都可以使用。

此处有更多信息:Why does git fast-forward merges by default?

答案 2 :(得分:0)

我有类似的愿望,并且无法使用自动工具。这是一个半自动化的解决方案:

master,合并add-on并手动解决更改:

开始于:

git merge --no-ff --no-commit add-on

然后,对于每个更改的文件,执行:

git show master:path/to/file > from_master
git show add-on/to/file > from_add-on
kdiff3 --qall from_master from_add-on -o path/to/file
git add path/to/file

最后,

git commit

为什么这个90%的解决方案?

即使在明显的情况下,此解决方案也会合并。并且它并没有强迫我设置.gitattributes所以我可以进行"手动合并"行为取决于我合并的对象和原因,而不是我合并的文件。