有没有办法通过简单地在合并到当前分支时接受来自其他分支的文件版本来明确解决合并冲突?我想避免使用凌乱的mergetool
,因为有一个文件经常被更改,我总是希望用合并分支中的版本覆盖我当前分支的那个文件版本,我不需要看在行级别差异以协调增量。
E.g。
git merge other_branch
Auto-merging path/frequently_changed.txt
CONFLICT (content): Merge conflict in path/frequently_changed.txt
Automatic merge failed; fix conflicts and then commit the result.
是否可以快速从 other_branch 中获取冲突文件的版本,假设它可以覆盖同一文件的当前分支版本?
答案 0 :(得分:2)
我会建议这种方法:
$ git checkout mybranch
$ git merge --no-commit theirbranch
$ git reset theirbranch -- messyfile
$ git checkout messyfile
$ git commit
尝试对合并驱动程序使用不同的合并驱动程序或选项的问题是它们适用于整个合并,而不仅仅是特定文件。除非这种情况经常发生,否则上述方法可能是最简单和最快捷的。如果你必须经常这样做,那么使用自定义合并驱动程序的方法和其他一个答案中解释的.gitattributes
可能是值得的。
答案 1 :(得分:1)
您需要配置合并驱动程序:
git config --local merge.use_their.driver "use_their.sh %A %B"
在这里,您指示git在合并期间运行带有参数use_their.sh
的{{1}}。
%A %B
是合并文件的当前版本。在脚本完成其工作之后,这里必须是文件的最终版本,
%A
是该文件的另一个分支版本。
您可以使用documentation
找到有关可能占位符的更多信息所以你需要让文件的当前版本和其他分支的版本看起来很相似。
现在你需要这个脚本。例如,它可能看起来像这样:
%B
这个脚本有两个参数,第一个是文件当前版本的名称,第二个是来自另一个分支的版本。 Git只是将文件的其他分支版本的内容复制到文件的当前版本中。
然后您需要配置$ cat use_their.sh
#!/bin/bash
cp $2 $1
。由于驱动程序名为gitattributes
,因此使用此名称:
use_their
这里使用星号是为了使所有带冲突的文件变成另一个分支的版本。您可以根据需要自定义它,例如对不同类型的文件使用不同的驱动程序等。
提供了文件echo "* merge=use_their" >> .gitattributes
的两个版本:在a
分支中包含master
,在ours
分支中包含their_branch
。让我们看看驱动程序的运行情况:
their
正如您所见,使用$ git branch
* master
their_branch
$ cat a
ours
$ git checkout their_branch
Switched to branch 'their_branch'
$ cat a
their
$ git checkout master
Switched to branch 'master'
$ git merge their_branch
Auto-merging a
Merge made by the 'recursive' strategy.
a | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ cat a
their
脚本的git成功解决了冲突。
答案 2 :(得分:0)
如果您想要文件级别,也可以尝试git merge-file
。
Docs