是`git merge`能够显示每次变化(对于共同的祖先)作为合并冲突吗?

时间:2016-09-15 10:09:52

标签: git merge

假设我们有一个文件common_ancestormaster

ok
ok
ok
ok
ok

从那里,我们将master更改并提交至

ok
change not ok (looking back)
ok
ok
ok
latest change
ok

现在我们有一个更好的主意,结帐common_ancestor并将其更改为

ok
ok
ok
This is a really good change
ok
ok

并在新分支dev中提交。由于我需要master的一些开发,我想将dev合并到master,但我想决定是否保留每个更改。我试过了

git checkout master
git merge dev --no-ff --no-commit

但我没有得到expected。我正在寻找的是:

ok
<<<<HEAD
change not ok (looking back)
====
>>>> HASH
ok
ok
<<<<HEAD
====
This is a really good change
>>>> HASH
ok
<<<<HEAD
latest change
====
>>>> HASH

其中冲突标记可见(请参阅here)。

修改:我所看到的,git merge dev --no-ff --no-commit没有突出显示更改 - @VonC解释了为什么没有冲突标记可见(因为没有冲突!)。

3 个答案:

答案 0 :(得分:2)

在您的情况下,将dev合并到master只会:

  • 添加dev&#34; This is a really good change&#34;
  • 的更改
  • 保持master&#34; change not ok (looking back)&#34;
  • 中引入的更改

这是因为这些更改不是在文件中的同一位置进行的:同一行没有并发修改。
这意味着没有冲突。

如果您想查看合并(但在合并提交之前),则can set up a custom merge driver

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

您可以将该驱动程序与.gitattributes file中的文件相关联。

*.R merge=merge and verify driver

使用merge-and-verify-driver.sh一个始终返回1的脚本,以表明存在冲突,即使实际已经解决了合并而没有冲突(这种情况就是这样:合并中没有冲突)。 / p>

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

注意:如果发生冲突,您将获得更多信息:

git config --global merge.conflictstyle diff3

答案 1 :(得分:2)

正如@VonC指出的那样,将两个版本中的差异视为冲突是不正确的。所以他回答了我的问题。为了实现我的目标,我使用了

git difftool -t=kdiff3 dev master

以及其中的合并工具。在kdiff3中,每个差异都会突出显示,您可以选择要保留的每行的版本。 另请参阅here了解视频教程。

答案 2 :(得分:0)

  

我想将dev合并为master,但我想决定是否保留每个更改。

这需要一个交互式的rebase:

git branch dev_rebase dev
git checkout dev_rebase
git rebase -i master

然后从那里开始。 git help rebase,寻找&#34;互动模式&#34;应该给你一些想法。只需删除要跳过的行(提交),如果要执行部分提交但需要编辑文件,请使用edit

如果出现严重错误,dev无论如何都不会受到影响。

# if happy:

git checkout master
git merge --no-ff dev_rebase

# for good measure:

git checkout dev
git rebase master