8

在“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] 我尝试了 --no-commit 这个结果:

$ 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”正在被使用/阅读?

4

3 回答 3

6

你没有合并。您的命令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执行每个块的分段。

于 2012-04-12T20:53:54.540 回答
3

您可能想尝试:

git merge --no-commit

这将使 GIT 不会提交合并更改。或者,如果您希望它在没有冲突时提交,但又不丢失源分支,那么它是 no-ff:

git merge --no-ff

如有必要,两者都可以使用。

更多信息在这里:为什么默认情况下 git 快进合并?

于 2012-04-12T20:55:06.857 回答
2

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

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,因此我可以根据我从谁合并以及为什么而不是我要合并的文件来进行“手动合并”行为。

于 2014-04-16T21:21:35.680 回答