假设我们有一个文件common_ancestor
(master
)
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解释了为什么没有冲突标记可见(因为没有冲突!)。
答案 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