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

GoZ*_*ner 7 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
Run Code Online (Sandbox Code Playgroud)

对于上面的'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
Run Code Online (Sandbox Code Playgroud)

请注意,上面的'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
Run Code Online (Sandbox Code Playgroud)

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

Lil*_*ard 7

你没合并.你的命令git merge add-on执行了"快进",这意味着它只是移动了分支头.这是因为您的add-on分支已经从分支的尖端下降master,因此不需要合并.如果你运行git log你将看到没有合并提交.

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

              master
             /
o---o---o---o           add-on
             \         /
              o---o---o
Run Code Online (Sandbox Code Playgroud)

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

                          master, add-on
                         /
o---o---o---o---o---o---o
Run Code Online (Sandbox Code Playgroud)

如果要强制合并,请传递--no-ff标记,如下所示git merge --no-ff add-on.


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

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

  • 谢谢。我再次尝试使用“git merge --no-ff add-on” - 仍然没有所需的合并冲突。 (2认同)