在'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'是否被使用/读取?
答案 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
必要时都可以使用。
答案 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
即使在明显的情况下,此解决方案也会合并。并且它并没有强迫我设置.gitattributes所以我可以进行"手动合并"行为取决于我合并的对象和原因,而不是我合并的文件。